次のような整数へのポインタがある場合:
int num = 12;
int *p = #
そして、住所を印刷します
printf("%p\n", (void*)p);
前とこれの違いは何ですか:
printf("%p\n", (void*)&p);
次のような整数へのポインタがある場合:
int num = 12;
int *p = #
そして、住所を印刷します
printf("%p\n", (void*)p);
前とこれの違いは何ですか:
printf("%p\n", (void*)&p);
ここで、p
には のアドレスが含まれているnum
ため、最初のprintf
出力は のアドレスですnum
。
一方、&p
は のアドレスなp
ので、2 番目printf
は のアドレスを出力しますp
。
あなたの例を取る -
int num = 12;
int *p = # // store address of num in pointer p
printf("%p\n", (void*)p); // line 1
printf("%p\n", (void*)&p); // line 2
1 行目 - これはnum
、ポインターに格納されている変数のアドレスを出力しますp
。したがって、ポインタに格納される値p
は整数変数のアドレスですnum
。
2 行目p
- ポインター自体のこのアドレスに出力されます。operatorのアドレスの使用に注意してください。ポインタのアドレスを与えますp
。
この"%p"
形式では、プレーンのみを使用p
すると、変数の内容p
、つまりポインター変数p
が指しているアドレスが出力されます。
使用&p
すると、 variable のアドレスp
、つまりへのポインターp
( type の場合int **
) を取得し、そのポインターを出力します。
このように見ることができます:
+----+ +---+ +-----+ | | &p | -> | p | -> | 番号 | +----+ +---+ +-----+
つまり、がを指す&p
ポイント。p
num
継続して使用しようとすると*p
、期待どおりに動作しません。つまり、ポインターp
があった場所の値p
(この特定のケースでは変数num
とその値) になります。*p
は型の値であり、形式をint
使用して出力しようとすると、未定義の動作が発生します。これは、 がポインターではなく値であり、形式がポインターを想定しているためです。"%p"
*p
"%p"
ほとんどの場合、悪いことは何も起こらず、ポインターのサイズが のサイズと同じであるint
システム (ほとんどの 32 ビット システム) では、ステートメントは次のようになります。
printf("%p", (void *) *p);
c
の値である16 進値12
である を出力するだけですnum
。
ただし、典型的な 64 ビット システムのように、ポインターのサイズが のサイズと同じでない場合、出力は予測可能なものではなく、ほとんどが完全にランダムに見えます。int
前者は num のアドレスを出力します。そして後者はポインタ p のアドレスを出力します。なぜなら、すべてを保存するにはメモリ内の場所が必要だからです。
整数を取る場合、格納されている物理アドレスと、その場所に格納されているデータ (整数) があります。
ポインタを取ると、メモリに格納される物理アドレスもありますが、ここではデータは整数変数のアドレスである別のアドレスになります。
& は演算子のアドレスと呼ばれます。特定の変数が格納されているメモリアドレスを返します。同じ例に従って、
printf("%p\n", (void*)p);
ポインター p が指しているデータを出力します。つまり、num のアドレスです。
を使用して同様の結果を得ることができます。
printf("%p\n", (void*)&num);
したがって、どちらも同じ結果になります。
一方、
printf("%p\n", (void*)&p);
ポインタ p のアドレスを出力します。
(void*)&p
pのアドレスを意味します。
(void*)p
pの内容(この場合は のアドレス)を意味しますnum
。
(void*)*p
変数が指す ( ) (の値)の内容を意味します。p
12
num
アドレス演算子の詳細については、http://www.c4learn.com/c-programming/c-pointer-address-operator/を参照してください。
printf("%p\n", (void*)p);
p
のアドレスであるを含む値を出力しますnum
。
printf("%p\n", (void*)&p);
ポインターp
自体のアドレスを出力します。
ac/c++ 関数で渡すことができる型引数は 2 つあります。
1 つ目は、同じ値をコピーする (void)p のようなプログラムを呼び出す値による呼び出しで、その特定の void 関数の値は変更されません。
2 つ目は参照による呼び出しで、実際にメモリに入り、その特定の場所/アドレスを見つけて、そこで値を変更します。あなたの場合はどちらですか (void)&p