4

これは、配列内のポインタの動作をテスト/理解するために作成したコードです。

int main(void){
    int a[4];
    memset(a, 0, sizeof(a));
    printf("%x %x\n",a,&a);
}
Output of the above program on my machine:
bfeed3e8 bfeed3e8

値aと&aが同じである理由がわかりません。私が理解していることから、&aはaが格納されているメモリ位置のアドレスを与えることになっています。この種の行動の説明は何ですか?

4

8 に答える 8

9

&aの住所を教えてくれますaaこれはa配列であるため、へのポインターに減衰しますa

または、ペダン的に言うと、へのポインターに減衰しますa[0]

于 2012-04-20T13:40:43.897 に答える
4

そのコンテキストでは、配列名aはその最初の要素へのポインターに分解されます。もしかして

printf("%x %x\n",a[0],&a);
于 2012-04-20T13:40:25.903 に答える
1

&aは型int (*)[4]( の 4 要素配列へのポインターint) を持ち、配列オブジェクトのアドレスに評価されます。この点で、配列へのポインタは他のものへのポインタに似ています。

気になるのは、式がどのようにa扱われるかです。sizeofまたは 単項演算子のオペランドである場合&、または宣言内の別の配列を初期化するために使用される文字列リテラルである場合を除き、型「N 要素配列」の式Tは / に変換され / に「減衰」します値が配列内の最初の要素のアドレスである型T *( へのポインター)の式。T配列のアドレスと配列の最初の要素のアドレスは同じなので、どちらの式も同じを返しますが、は異なります。

于 2012-04-20T15:18:16.650 に答える
0

C では、この場合の配列名はaラベルと見なされ、配列のアドレスを表します。それにアンペサンドを適用すると、同じものとして解釈されます。

関数ポインタにも同様の問題があります。が関数へのポインタである場合、 と の両方をfunc使用して関数を呼び出すことができます。func()(*func)()

特別な方法で扱われる間接構文のケースがあります。

于 2012-04-20T13:44:47.210 に答える
0
int test[10]         = test is pionter as well as &test

ベース以外の要素をアドレス指定する場合は、&test[4] を使用します

ところで

&test = @test[0] = test

基本要素へのすべてのポインタ

于 2012-04-20T13:43:19.357 に答える
0

配列名「a」は、配列の最初の要素を指します。

よりよく理解するために:

  *(a + 2) is same with a[2].
于 2012-04-20T13:44:05.270 に答える
0

配列の名前は、それが保持するメモリ ブロックの先頭も指します。大したことはありません。

これらはすべて同等です。

printf("%x\n",a);
printf("%x\n",&a);
printf("%x\n",&a[0]);
于 2012-04-20T13:42:09.220 に答える
0

ポインター コンテキストでは、配列はポインターに減衰します。したがってa、配列の最初のバイトのアドレスに減衰し、&a定義による最初のバイトのアドレスです。おそらく、printfの代わりに*aorを使用したかったでしょう。a[0]&a

于 2012-04-20T13:43:05.783 に答える