回答編集履歴
1
ソースコード、配列の添字をマクロでなく数字に変更
answer
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
私の手元で、こんなコードをコンパイルしてみました(GCC 5.4.0, x86 64bit)。
|
4
4
|
```C
|
5
|
-
int score[
|
5
|
+
int score[3][2];
|
6
6
|
|
7
|
-
for (int i = 0; i <
|
7
|
+
for (int i = 0; i < 3; i++) {
|
8
8
|
printf(" (score + %d) = %p\n", i, (score + i)); // (A)
|
9
9
|
printf(" *(score + %d) = %d\n", i, *(score + i)); // (B) Warning
|
10
10
|
printf(" *(score + %d) = %p\n", i, *(score + i)); // (C)
|
@@ -30,8 +30,7 @@
|
|
30
30
|
|
31
31
|
> *(score+0)は何を示しているのでしょうか
|
32
32
|
|
33
|
-
(score + i) は score[i][0] のアドレスです。でも文法上 (score + i) は、まだ score[i][0] をポイントしていない、**score[i][0] と score[i][1] をまとめたモノ**をポイントしている、そのようにコンパイラは扱っている、そう解釈すれば事情が見えてきます。
|
34
|
-
即ち、「*」をつけて「*(score + i)」とアクセスし、ポインタを使って取りだした中身は**要素数2の配列**なのです。
|
33
|
+
(score + i) は score[i][0] のアドレスです。でも文法上 (score + i) は、まだ score[i][0] をポイントしていない、**score[i][0] と score[i][1] をまとめたモノ**をポイントしている、そのようにコンパイラは扱っている、即ち「*」をつけて「*(score + i)」とアクセスし、ポインタを使って取りだした中身は**要素数2の配列**なのです。そう解釈すれば事情が見えてきます。
|
35
34
|
|
36
35
|
さて、Cコンパイラが配列を値として扱う場合、その値は何か?それは**配列の先頭アドレス**です。そう考えれば、*(score + 0) == (score + 0) で良いのではないでしょうか。
|
37
36
|
|