たとえば、私は
char* c=(char *)malloc(100*sizeof(char));
printf("0x%x,c);
printf("0x%x,&c);
c
これはとの異なる値を示します&c
。
ただし、次の場合:
char d[100];
printf("0x%x,d);
printf("0x%x,&d);
これは、 と の値が同じであることを示していd
ます&d
。
c
最初のコードでとの結果が異なるのは&c
なぜですか?
配列は、関数呼び出しでの使用を含め、多くのコンテキストで最初の要素へのポインターに崩壊します。単項(address-of) 演算子のオペランドの場合は減衰しません。&
つまり、例では同じアドレス d
を生成しますが、タイプは異なります。と、それぞれ、あなたの場合。&d
char *
char (*)[100]
対照的にc
、ポインタです。でアドレスを取得すると、直接 &
使用するのとは対照的に、ポインター変数のアドレスを取得しているため、ポインター変数が指しているアドレスが得られます。は であり、です。c
c
char *
&c
char **
編集上の注記:%p
ポインター型を出力するために使用します。 %x
は 用でありunsigned int
、unsigned int
ポインターとはサイズが異なる場合があります。修正されたコードは次のようになります。
printf("%p\n", (void *)c);