第四項 ポインターを使った関数

ポインターは関数の中で使うことで真価を発揮します。
関数の中で使う前にポインターの使い方について復習しておきます。
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);