1

次のような整数へのポインタがある場合:

int num = 12;
int *p = #

そして、住所を印刷します

printf("%p\n", (void*)p);

前とこれの違いは何ですか:

printf("%p\n", (void*)&p);
4

7 に答える 7

3

ここで、pには のアドレスが含まれているnumため、最初のprintf出力は のアドレスですnum

一方、&pは のアドレスなpので、2 番目printfは のアドレスを出力しますp

于 2016-05-21T18:35:58.973 に答える
2

あなたの例を取る -

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

于 2016-05-21T18:34:34.713 に答える
2

この"%p"形式では、プレーンのみを使用pすると、変数の内容p、つまりポインター変数pが指しているアドレスが出力されます。

使用&pすると、 variable のアドレスp、つまりへのポインターp( type の場合int **) を取得し、そのポインターを出力します。

このように見ることができます:

+----+ +---+ +-----+
| | &p | -> | p | -> | 番号 |
+----+ +---+ +-----+

つまり、がを指す&pポイント。pnum


継続して使用しようとすると*p、期待どおりに動作しません。つまり、ポインターpがあった場所の値p(この特定のケースでは変数numとその値) になります。*pは型の値であり、形式をint使用して出力しようとすると、未定義の動作が発生します。これは、 がポインターではなく値であり、形式がポインターを想定しているためです。"%p"*p"%p"

ほとんどの場合、悪いことは何も起こらず、ポインターのサイズが のサイズと同じであるintシステム (ほとんどの 32 ビット システム) では、ステートメントは次のようになります。

printf("%p", (void *) *p);

cの値である16 進値12である を出力するだけですnum

ただし、典型的な 64 ビット システムのように、ポインターのサイズが のサイズと同じでない場合、出力は予測可能なものではなく、ほとんどが完全にランダムに見えます。int

于 2016-05-21T18:33:54.017 に答える
1

前者は num のアドレスを出力します。そして後者はポインタ p のアドレスを出力します。なぜなら、すべてを保存するにはメモリ内の場所が必要だからです。

整数を取る場合、格納されている物理アドレスと、その場所に格納されているデータ (整数) があります。

ポインタを取ると、メモリに格納される物理アドレスもありますが、ここではデータは整数変数のアドレスである別のアドレスになります。

& は演算子のアドレスと呼ばれます。特定の変数が格納されているメモリアドレスを返します。同じ例に従って、

printf("%p\n", (void*)p);

ポインター p が指しているデータを出力します。つまり、num のアドレスです。

を使用して同様の結果を得ることができます。

printf("%p\n", (void*)&num);

したがって、どちらも同じ結果になります。

一方、

printf("%p\n", (void*)&p);

ポインタ p のアドレスを出力します。

于 2016-05-21T18:34:11.280 に答える
1

(void*)&ppのアドレスを意味します。

(void*)ppの内容(この場合は のアドレス)を意味しますnum

(void*)*p変数が指す ( ) (の)の内容を意味します。p12num

アドレス演算子の詳細については、http://www.c4learn.com/c-programming/c-pointer-address-operator/を参照してください。

于 2016-05-21T18:33:32.573 に答える
1
printf("%p\n", (void*)p);

pのアドレスであるを含む値を出力しますnum

printf("%p\n", (void*)&p);

ポインターp自体のアドレスを出力します。

于 2016-05-21T18:38:42.887 に答える
0

ac/c++ 関数で渡すことができる型引数は 2 つあります。

1 つ目は、同じ値をコピーする (void)p のようなプログラムを呼び出す値による呼び出しで、その特定の void 関数の値は変更されません。

2 つ目は参照による呼び出しで、実際にメモリに入り、その特定の場所/アドレスを見つけて、そこで値を変更します。あなたの場合はどちらですか (void)&p

于 2016-05-21T18:51:51.680 に答える