たとえば、私は
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を生成しますが、タイプは異なります。と、それぞれ、あなたの場合。&dchar *char (*)[100]
対照的にc、ポインタです。でアドレスを取得すると、直接 &使用するのとは対照的に、ポインター変数のアドレスを取得しているため、ポインター変数が指しているアドレスが得られます。は であり、です。ccchar *&cchar **
編集上の注記:%pポインター型を出力するために使用します。 %xは 用でありunsigned int、unsigned intポインターとはサイズが異なる場合があります。修正されたコードは次のようになります。
printf("%p\n", (void *)c);