teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

ソースコード、配列の添字をマクロでなく数字に変更

2017/12/30 08:34

投稿

rubato6809
rubato6809

スコア1382

answer CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  私の手元で、こんなコードをコンパイルしてみました(GCC 5.4.0, x86 64bit)。
4
4
  ```C
5
- int score[ROW][COL];
5
+ int score[3][2];
6
6
 
7
- for (int i = 0; i < ROW; 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