int a[10];
printf("%p ", &a);
配列のアドレスを表示しますa
。
したがって、リダイレクトを実行すると、*(&a)
に値が格納されないのはなぜですかa[0]
。のアドレスを取得する必要があることを示すC言語のルールは何ですかa
。はい、それは理にかなっています、私はのアドレスを取得しますa
。なぜなら*
、と&
は互いにキャンセルし、単純a
に、のアドレスになりa
ます。
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
値は の値と同じです。a
a
int
どちらも同じアドレスから始まるため、印刷されるアドレスは同じになることに注意してください。
引数が必要なため、必要void *
なキャストを追加しました。p
void *
これを管理する C 規則は C 2011 6.3.2.1 3 です。 has type ''array of type'' は、配列オブジェクトの最初の要素を指し、左辺値ではない ''pointer to type'' 型の式に変換されます。」</p>
a
int の配列です。printf に渡すa
と、ルールによって int へのポインターに変換され、そのポインターの値が出力されます。
&a
printfに渡す場合: まず、a
は のオペランドで&
あるため、ルールは適用されません。a
intへのポインタには変換されません。int の配列のままです。次に、&
が評価されます。&a
配列のアドレスを生成し、このアドレスが出力されます。配列のアドレスは最初の要素のアドレスと同じであるため、アドレスが出力されます。
式の型&a
は「int の配列へのポインタ」であることに注意してください。したがって、 がある場合、int の配列へのポインターに*&a
適用*
され、結果は int の配列になります。式は int の配列であるため、規則が適用され、この int の配列は最初の要素へのポインターに変換され、そのポインターの値が出力されます。
事実:
a[0] == *(a)
a[9] == *(a+9)
に評価されるポインターの型は&a
、配列へのポインター (具体的には へのポインターint[10]
) です。これは、同じアドレスであっても、配列の最初の要素へのポインターとは異なる型です。
printf("%d ", *&a[0]);
&a[0]
type があるため、配列の最初の要素の値を出力します int*
。