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の状態は変更なし