|
ちょっと補強したソースを書いてみました。
#include <stdio.h>
main(void)
{
int v = 12345678;
int *p = NULL; // NULLはポインタを初期化するための定数って思ってて
// これは大丈夫だよね?
printf("v = %d\n", v);
// &vがどんな値か見てみよう。
printf("&v = %p\n", &v);
// ついでにpの中にどんな値が入っているか見てみよう
printf("p = %p\n", p);
// &vの値をpに代入
p = &v;
// pの値は&vと等しいか確認してみよう
puts("after \"p = &v\"");
printf("p = %p\n", p);
// *pの値を見てみよう
printf("*p = %d\n", *p);
return 0;
}
実行結果はこんな感じです。
$ ./pointer.exe
v = 12345678
&v = 0x22feec
p = 0x0
after "p = &v"
p = 0x22feec
*p = 12345678
変数(や関数)には識別子が付いています。
で。変数の前に'&'を記述すれば変数の識別子がわかるようになります。
上の実行結果の場合だと 0x22feec ってのが変数vの識別子になります。
ポインタ変数はその識別子を格納するためにある専用の変数です。
だから実行結果の p = 0x22feec のようにpにはvの識別子が入っています。
では、識別子で示される変数に格納されている値を参照するには
どのようにするかというと
(関数の処理定義部で)ポインタ変数の前に'*'をつければ
参照できるようになります。
上の実行結果では*pとvが等しいことから*pでvの値を
参照できていることがわかります。
あまり、上手く説明できていないと思うので
わからないことがあればレスをつけてみてください。
#物見より上手く説明してくれる諸兄が現れるかもしれませんし。
ちなみに、上記はメモリを意識しないように説明しました。念のため。
#以前規格の話が出てたので。
|