1

重複の可能性:
C: 配列のアドレスがその値と等しいのはなぜですか?
Cポインタ:配列変数

多次元配列を考える:

int c[1][1];

次の式がすべて同じアドレスを指しているのはなぜですか??

printf("%x", (int *) c);      // 0x00000500
printf("%x", *c);             // 0x00000500
printf("%x", c);              // 0x00000500

ポインターの実際の値とその参照解除された値がどのように同じになるのでしょうか?

4

3 に答える 3

1

ほとんどの状況1では、「N要素配列」の式はT「崩壊」型の式に変換され(「減衰」)、「ポインタT」型の式に変換され、式の値は配列の最初の要素のアドレスになります。 。

式のcタイプはint [1][1];です。上記のルールにより、式はタイプint (*)[1]、つまり「の1要素配列へのポインタ」に減衰しint、その値はと同じになります&c[0]。このポインタを(式のように*c)逆参照すると、「1要素配列のint」型の式が得られます。これも上記の規則により、型の式に減衰し、int *その値はと同じになります&c[0][0]

配列の最初の要素のアドレスは配列自体のアドレスと同じであるため、&c== &c[0]== &c[0][0]======cです。これらの式はすべて、同じタイプ(それぞれ、、、、、、、および)を持っていなくても、同じアドレスに解決されます。 *cc[0]int (*)[1][1]int (*)[1]int *int (*)[1]int *int *


1-この規則の例外は、配列式が、、、または単項演算子のオペランドであるsizeof場合、または宣言で別の配列を初期化するために使用される文字列リテラルである場合です。_Alignof&

于 2012-10-10T18:42:39.907 に答える
1

考えてみてください: この配列の最初の位置はどこですか?

0x00000050メモリ空間でオンになっているとします。配列の最初の項目は何ですか? それc[0][0]は で、そのアドレスは0x00000050です。案の定、最初の位置のアドレスは配列と同じです。たとえそうしてもc[0]、正しい型にキャストする限り、同じアドレスを指します。

ただし、配列へのポインタを混同しないでください。

于 2012-10-10T17:02:39.797 に答える
0

How would a pointer's actual value and it's derefernced value can be the same
ポインタではなく、配列です。

Q&A #3 & #4 を参照

c配列のアドレスです。c最初の要素のアドレスでもあります。

于 2012-10-10T17:01:54.850 に答える