- 締切済み
ポインタについて
下記プログラムはどういう動きをしているのでしょうか。 「printf("&a\t--> %p\n", &a );」は、なぜ「&a」なのでしょうか。 aはポインタ変数として宣言してあるのだから、アドレスを表す場合、「a」ではないのでしょうか。 「a = &value;」でvalueのアドレスをaに受け渡していると思うのですが、この場合、1つのアドレスを複数の変数が指しているということでしょうか。 aの値を25に書き換えれば、valueの値も25になるのでしょうか。 では逆にvalueの値を30に書き換えれば、aの値も30になるのでしょうか。 #include <stdio.h> int main() { int value = 10; int *a; printf("&value\t--> %p\n", &value); printf("&a\t--> %p\n", &a ); a = &value; printf("*a\t--> %d\n", *a ); *a = 25; printf("value \t--> %d\n", value ); return 0; }
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- asuncion
- ベストアンサー率33% (2127/6290)
>>今まで使っていたポインタ変数のアドレスを表していた「a」 >aは、ポインタ変数です。ポインタ変数のアドレスを表わすのではありません。 もっと正確に書くと、 aは、ポインタ変数の値を表わします。ポインタ変数のアドレスを表わすのではありません。 valueは、int型の変数です。何らかの値(例えば10とか-123)を持ちます。 valueのアドレスを取得する式は、&valueです。今回は、その値を、aというint *型の変数に代入しています。 aは、int *型の変数です。何らかの値(別の変数のアドレス)を持ちます。今回は、&valueという値を持っています。 aのアドレスを取得する式は、&aです。今回は、その値を、printf()で出力しています。
- asuncion
- ベストアンサー率33% (2127/6290)
>今まで使っていたポインタ変数のアドレスを表していた「a」 これは間違いです。 aは、ポインタ変数です。ポインタ変数のアドレスを表わすのではありません。 aは、何らかの値を持ちます。今回は、valueのアドレス、という値です。 先ほどの回答でも書きましたが、aは、メモリ空間のどこかにありますので、 アドレスを取得することができます。そのための式が、&aです。
お礼
ご回答ありがとうございました。
- asuncion
- ベストアンサー率33% (2127/6290)
>「a = &value;」でvalueのアドレスをaに受け渡していると思う そうですね。 >この場合、1つのアドレスを複数の変数が指しているということでしょうか。 違います。 くだんのソースコードに登場しているポインタ変数は、aだけです。 aが、valueを指している、という状況しかありません。 つまり、ポインタ変数aの値が、valueのアドレスである、という状況しかありません。 valueはポインタ変数ではありませんので、どこかを指している、ということはありません。 >今まで使っていたポインタ変数のアドレスを表していた「a」とは、どう違うのでしょうか。 int *a; という定義で、int型のポインタ変数aを定義します。 aはメモリ空間のどこかにありますので、アドレスを持ちます。 それを取得するのが、&aです。 以下の場合と、本質的に何ら違いはありません。 int n; という定義で、int型の変数nを定義します。 nはメモリ空間のどこかにありますので、アドレスを持ちます。 それを取得するのが、&nです。
お礼
ご回答ありがとうございました。
- ts244
- ベストアンサー率41% (53/127)
簡単にa=&value とした時点のイメージを書きますね []がメモリ =>がだと思ってください [value] => 10 [a] => valueのアドレス &a => aのアドレスです
お礼
ご回答ありがとうございました。
- ts244
- ベストアンサー率41% (53/127)
>「printf("&a\t--> %p\n", &a );」は、なぜ「&a」なのでしょうか。 int型へのポインタ a自身に割り当てられたアドレス(ポインタ)を表示しているだけです。 >「a = &value;」で~1つのアドレスを複数の変数が指しているということでしょうか。 そうです。 >aの値を25に書き換えれば、valueの値も25になるのでしょうか。 なりません。従って a=25は訳の分からないアドレスを挿すようになるだけです。aが持っている値はこの時点では"value"のアドレスで、(*a)がvalueの値です。 おそらく"*a = 25"のところを仰っているのだと思いますが、ここを間違えると理解の妨げになるので、きちんと区別して表現するように癖をつけてください。 >valueの値を30に書き換えれば、aの値も30になるのでしょう 上記の通り"a"の値は変わりませんが、"(*a)"の値が変わります
お礼
ご回答ありがとうございました。
補足
>int型へのポインタ a自身に割り当てられたアドレス(ポインタ)を表示しているだけです。 今まで使っていたポインタ変数のアドレスを表していた「a」とは、どう違うのでしょうか。
お礼
ご回答ありがとうございました。