「ポインタ応用編」(2019/04/25 (木) 13:30:27) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
*第四項 ポインターを使った関数
ポインターは関数の中で使うことで真価を発揮します。
関数の中で使う前にポインターの使い方について復習しておきます。
int* p; //int型ポインターpを宣言。
int num = 0; //int型の変数numを宣言。
p = # //pにnumのアドレスを格納
*p = 5; //pからアクセスしてnumの値を変更
int a = *p; //pからアクセスしてnumを参照
* と & の使い方を覚えてください。
ポインターから変数へアクセスすることで値を変更したり、参照したりできることを覚えてください。
今まで scanf関数に変数を渡すときは変数の前に & を付けていました。
これは変数のアドレスを渡していたのです。
変数のアドレスを渡すことができれば、scanf関数は数値を代入することができます。
変数名の前に & を付ける以外にもう一つアドレスを渡す方法があります。
ポインターを宣言し、変数のアドレスを格納して、ポインターを引き数として渡す方法です。
int num = 0;
int* p = #
printf("数値を入力してください\n");
scanf("%d",p);
printf("入力された数値は%dです。\n",num);
整数型の引数を二つ受け取り、それぞれの値を入れ替える Swap関数を作ります。
void Swap(int* x,int* y){
int tmp = *x;
*x = *y;
*y = tmp;
}
/*~~~~~~~~~~中略~~~~~~~~~~*/
int a = 20;
int b = 10;
printf("aは%dです。\n",a);
printf("bは%dです。\n",b);
Swap(&a,&b); printf("aとbを入れ替えます。\n");
printf("aは%dです。\n",a);
printf("bは%dです。\n",b);
関数の引数に &a &b と書くことで、変数のアドレスを関数にわたします。
アドレスを受け取るにはポインターが必要です。
この関数では x,y のポインターでアドレスを受け止めています。
アドレスを受け止めた x,y から本体にアクセスします。
本体にアクセスすることで、変数本体の数値を参照、変更できます。
**練習問題
次のようなプログラムを作ってください。
第1問
int型変数のアドレスを受け取り、その変数に10を代入する関数を作る。
第2問
int型の変数 flag のアドレスを受け取り、flagの値が0なら1に1なら0にする関数を作る。
*第五項 ポインターのポインター
ポインターも変数の一種なので、自身もアドレスを持っています。
そのアドレスをほかのポインターに格納することもできます。
int num = 10;
int* p = #
int** pp = &p; //ポインターのアドレスを格納するポインター(ポインターのポインター)
printf("%d\n",**pp);
あまり使うことはないですが、ポインターのポインターのポインターも作ることができます。
int num = 5;
int* p = #
int** pp = &p;
int*** ppp = &pp;
printf("%d\n",***ppp);
[[ポインタの答え]]
*第四項 ポインターを使った関数
ポインターは関数の中で使うことで真価を発揮します。
関数の中で使う前にポインターの使い方について復習しておきます。
int* p; //int型ポインターpを宣言。
int num = 0; //int型の変数numを宣言。
p = # //pにnumのアドレスを格納
*p = 5; //pからアクセスしてnumの値を変更
int a = *p; //pからアクセスしてnumを参照
* と & の使い方を覚えてください。
ポインターから変数へアクセスすることで値を変更したり、参照したりできることを覚えてください。
今まで scanf_s関数に変数を渡すときは変数の前に & を付けていました。
これは変数のアドレスを渡していたのです。
変数のアドレスを渡すことができれば、scanf_s関数は数値を代入することができます。
変数名の前に & を付ける以外にもう一つアドレスを渡す方法があります。
ポインターを宣言し、変数のアドレスを格納して、ポインターを引き数として渡す方法です。
int num = 0;
int* p = #
printf("数値を入力してください\n");
scanf_s("%d",p);
printf("入力された数値は%dです。\n",num);
整数型の引数を二つ受け取り、それぞれの値を入れ替える Swap関数を作ります。
void Swap(int* x,int* y){
int tmp = *x;
*x = *y;
*y = tmp;
}
/*~~~~~~~~~~中略~~~~~~~~~~*/
int a = 20;
int b = 10;
printf("aは%dです。\n",a);
printf("bは%dです。\n",b);
Swap(&a,&b); printf("aとbを入れ替えます。\n");
printf("aは%dです。\n",a);
printf("bは%dです。\n",b);
関数の引数に &a &b と書くことで、変数のアドレスを関数にわたします。
アドレスを受け取るにはポインターが必要です。
この関数では x,y のポインターでアドレスを受け止めています。
アドレスを受け止めた x,y から本体にアクセスします。
本体にアクセスすることで、変数本体の数値を参照、変更できます。
**練習問題
次のようなプログラムを作ってください。
第1問
int型変数のアドレスを受け取り、その変数に10を代入する関数を作る。
第2問
int型の変数 flag のアドレスを受け取り、flagの値が0なら1に1なら0にする関数を作る。
*第五項 ポインターのポインター
ポインターも変数の一種なので、自身もアドレスを持っています。
そのアドレスをほかのポインターに格納することもできます。
int num = 10;
int* p = #
int** pp = &p; //ポインターのアドレスを格納するポインター(ポインターのポインター)
printf("%d\n",**pp);
あまり使うことはないですが、ポインターのポインターのポインターも作ることができます。
int num = 5;
int* p = #
int** pp = &p;
int*** ppp = &pp;
printf("%d\n",***ppp);
[[ポインタの答え]]
表示オプション
横に並べて表示:
変化行の前後のみ表示: