Download presentation
Presentation is loading. Please wait.
1
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
三井真吾 居室:工作実習棟 HP:佐々木敏彦研究室HP
2
ポインタ int x = 123; x //変数xの値123を表す(家) &x //変数xのアドレスを表す(住所) pt //アドレスを記録する変数(住所録) int a, b; int *pt; //ポインタptの宣言 pt = &a; //ポインタptにaのアドレスを記録 *pt = 100; //ptの指す中身に100を代入 b = *pt + 100; //bにptのさす中身+100を代入 メモリ 123 100 &a 200 変数 x a pt b アドレス &x &pt &b *ptはここを表す。
3
ポインタ 配列 char a[3] = “AB”; このときa == &a[0]となる。 変数とは異なることに注意。
ポインタ 配列 char a[3] = “AB”; このときa == &a[0]となる。 変数とは異なることに注意。 char st[]=“AB”; char *pt1, *pt2; pt1 = st; printf(“%c”, *pt1); printf(“%c”, *pt1+1); printf(“%c”, *pt1+2); pt2 = st; printf(“%c”, *pt2); pt2++; メモリ ‘A’ ‘B’ ‘\0’ 配列 a[0] a[1] a[2] アドレス &a[0] &a[1] &a[2] ポインタにこのアドレスを詰める。 配列名aだけだとこれを表す。 *pi1+1;とpt2++;とは次のアドレスに移動するという意味。 型によって移動量が異なる。
4
ポインタ 文字列 char *p = “ABC”; //”ABC”の先頭アドレスがポインタに詰められる。 char moji[4] = “ABC”; //文字列を定義 char *p; //ポインタを定義 p = moji; //ポインタに文字列の先頭アドレスを代入 //文字列は配列名だけで先頭アドレスを表す。 配列 moji[0] moji[1] moji[2] moji[3] char week[8][20] = {“Sunday”, ・・・・・・, “Saturday”} //それぞれの先頭アドレスがweek[0]、・・・・・・、 week[6]に詰められる。 例題 曜日をポインタを用いて出力せよ。 moji[4] = ‘A’ ‘B’ ‘C’ ‘\0’ 先頭アドレスをポインタpに代入。
5
関数 float wa(float x, float y); //関数waのプロトタイプ宣言 //始めのfloatは戻り値の型 int main () { float a=3, b=5; printf(“%f”, wa(a, b)); //関数waの戻り値を出力 //aとbを引数と呼ぶ return 0; } float wa(float x, float y){ //関数waの本体 float z=0; z = x + y; //和を計算する return z; //zの値を返す
6
関数 複数の戻り値 void swap(float *x, float *y); //戻り値がない時はvoid型 int main () { float a=3, b=5; printf(“a=%f, b=%f\n”, a, b); swap(&a, &b); //アドレスを渡す return 0; } void swap(float *x, float *y){ //アドレスをポインタに詰める float z=0; z = *x; *x = *y; //ポインタを書き換えることで *y = z; //見かけ上複数の値が返る
7
関数 配列の引数 float wa(float dt[5]); //仮引数に配列を指定 int main () { float sum[5]={1, 2, 3, 4, 5}; printf(“合計は%f”, wa(sum)); //引数に配列名を渡す return 0; } float wa(float dt[5]){ float z = 0; for(int i=0; i<5; i++){ printf(“%f ”, dt[i]); //通常の配列同様に使える z += dt[i]; return z;
8
関数 配列の引数(ポインタ) 例題 関数で配列を受け取り、中身を10倍するプログラムを作れ。
関数 配列の引数(ポインタ) float wa(float *dt); //ポインタで渡す int main () { float sum[5]={1, 2, 3, 4, 5}; printf(“合計は%f”, wa(sum)); return 0; } float wa(float *dt){ float z = 0; for(int i=0; i<5; i++){ printf(“%f”, *dt + i); z += *dt + i; //配列を進める return z; float wa(float *dt); int main () { float sum[5]={1, 2, 3, 4, 5}; printf(“合計は%f”, wa(sum)); return 0; } float wa(float *dt){ float z = 0; for(int i=0; i<5; i++){ printf(“%f”, dt[i]); z += dt[i]; //配列風に使える return z; 例題 関数で配列を受け取り、中身を10倍するプログラムを作れ。 ヒント:data[5]={1,2,3,4,5}を関数に渡すと10,20,30,40,50になって返ってくる。
9
関数 配列の戻り値 void change(float *dt); //ポインタで渡す int main () { float data[5]={1, 2, 3, 4, 5}; for(int i=0; i<5; i++)printf(“%f ”, data[i]); printf(“\n”); change(data); return 0; } void change(float *dt){ for(int i=0; i<5; i++) dt[i] = dt[i] * 10; //ポインタを書き換え
10
ファイル出力 #include <stdio.h> int main() { FILE *ofs; ofs = fopen(“test.txt”, “w”); fprintf(ofs, “name 12345”); fclose(ofs); return 0; } モード 動作 "r" 読み出し専用 "w" 書き込み専用 "a" 追加書き込み専用 "r+" 読み込みと書き込み "w+" 書き込みと読み込み "a+" 読み込みと追加書き込み
11
ファイル入力 #include <stdio.h> int main(){ FILE *ifs; ifs = fopen("data.txt", "r"); char str[3][10]; int no[3]={0}, i=0; while(!feof(ifs)){ fscanf(ifs, "%d %s", &no[i], str[i]); i++; } fclose(ifs); for(int j=0; j<3; j++) printf("%d %s\n", no[j], str[j]); return 0;
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.