1
int a[10];
printf("%p ", &a); 

配列のアドレスを表示しますa

したがって、リダイレクトを実行すると、*(&a)に値が格納されないのはなぜですかa[0]。のアドレスを取得する必要があることを示すC言語のルールは何ですかa。はい、それは理にかなっています、私はのアドレスを取得しますa。なぜなら*、と&は互いにキャンセルし、単純aに、のアドレスになりaます。

4

4 に答える 4

2
int a[10];
printf("%p ", (void *) &a);  // address of the array
printf("%p ", (void *) a);   // adress of the first element of the array
printf("%p ", (void *) *(&a));// same as above

ここで、 の値はaと同じ&a[0]です。また、オブジェクトが の配列の場合、*&a値は の値と同じです。aaint

どちらも同じアドレスから始まるため、印刷されるアドレスは同じになることに注意してください。

引数が必要なため、必要void *なキャストを追加しました。pvoid *

于 2012-08-17T08:28:33.190 に答える
1

これを管理する C 規則は C 2011 6.3.2.1 3 です。 has type ''array of type'' は、配列オブジェクトの最初の要素を指し、左辺値ではない ''pointer to type'' 型の式に変換されます。」</p>

aint の配列です。printf に渡すaと、ルールによって int へのポインターに変換され、そのポインターの値が出力されます。

&aprintfに渡す場合: まず、aは のオペランドで&あるため、ルールは適用されません。aintへのポインタには変換されません。int の配列のままです。次に、&が評価されます。&a配列のアドレスを生成し、このアドレスが出力されます。配列のアドレスは最初の要素のアドレスと同じであるため、アドレスが出力されます。

式の型&aは「int の配列へのポインタ」であることに注意してください。したがって、 がある場合、int の配列へのポインターに*&a適用*され、結果は int の配列になります。式は int の配列であるため、規則が適用され、この int の配列は最初の要素へのポインターに変換され、そのポインターの値が出力されます。

于 2012-08-17T09:56:21.550 に答える
0

事実:

a[0] == *(a)
a[9] == *(a+9)
于 2012-08-17T08:30:45.203 に答える
0

に評価されるポインターの型は&a、配列へのポインター (具体的には へのポインターint[10]) です。これは、同じアドレスであっても、配列の最初の要素へのポインターとは異なる型です。

printf("%d ", *&a[0]);&a[0]type があるため、配列の最初の要素の値を出力します int*

于 2012-08-17T08:32:28.260 に答える