Return to Tech/cpluplu

About pointer

About pointer
pointerについて

int i = 0; これは int型の iという入れ物を宣言して 
0という数値を格納.

int *pi; int型のアドレスを格納する入れ物, int型の
入れ物の場所を格納するための入れ物という意味。 
なのでpointerと呼ばれる


pi = &i;  iの入れ物自身の場所(address)を pi という
入れ物に格納.

//piに格納されているアドレスの先の値を表示する
printf("i = %d\n", *pi);

//piに格納されているアドレスを表示
printf("pi = %p\n", pi);

//iのアドレスを表示
printf("&i = %p\n", &i);

実行結果
i = 0
pi = 0012FED4
&i = 0012FED4
例 swap
よくある例ですが

void swap(int x, int y);
void swap(int *x, int *y);
この2つは結果がことなります

void swap(int x, int y) {
	int tmp;
	tmp = x;
	x = y;
	y = x;
}

void swap(int *x, int *y) {
	int tmp;
	tmp = *x;
	*x = *y;
	*y = *x;
}

int x = 3;
int y = 5;

printf("swap(&x, &y)
  before x = %d, y = %d\n", x, y);

swap(&x, &y);

printf("swap(&x, &y)
  after x = %d, y = %d\n", x, y);

printf("swap(x, y)
  before x = %d, y = %d\n", x, y);

swap(x, y);

printf("swap(y, y)
  after x = %d, y = %d\n", x, y);

結果
x,yのアドレスをswapに渡す
swap(&x, &y) before x = 3, y = 5
swap(&x, &y) after  x = 5, y = 3
結果swap内で 外側のスコープの x, yの値が変更される

x,yの値をswapに渡すことになる
swap(x, y) before x = 5, y = 3
swap(x, y) after  x = 5, y = 3
結果、swap内のローカル変数x, yが変更されるだけで
swapのスコープから外れた後は x, yの状態は変更なし

Return to Tech/cpluplu