C++スコーラ
ポインタ応用編
最終更新:
cschola
-
view
第四項 ポインターを使った関数
ポインターは関数の中で使うことで真価を発揮します。
関数の中で使う前にポインターの使い方について復習しておきます。
関数の中で使う前にポインターの使い方について復習しておきます。
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関数は数値を代入することができます。
変数名の前に & を付ける以外にもう一つアドレスを渡す方法があります。
ポインターを宣言し、変数のアドレスを格納して、ポインターを引き数として渡す方法です。
ポインターから変数へアクセスすることで値を変更したり、参照したりできることを覚えてください。
今まで 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 から本体にアクセスします。
本体にアクセスすることで、変数本体の数値を参照、変更できます。
アドレスを受け取るにはポインターが必要です。
この関数では x,y のポインターでアドレスを受け止めています。
アドレスを受け止めた x,y から本体にアクセスします。
本体にアクセスすることで、変数本体の数値を参照、変更できます。
練習問題
次のようなプログラムを作ってください。
第1問
int型変数のアドレスを受け取り、その変数に10を代入する関数を作る。
第2問
int型の変数 flag のアドレスを受け取り、flagの値が0なら1に1なら0にする関数を作る。
第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);