回答編集履歴
3
refine
test
CHANGED
@@ -18,17 +18,17 @@
|
|
18
18
|
|
19
19
|
これは厳密には少々誤りを含んでいます。`int a[1][2][3]`のような3次元配列があるとき、それぞれの式の評価結果は **型(type)** が異なっています:
|
20
20
|
|
21
|
-
- `a`は「
|
21
|
+
- `a`は「3次元配列型`int[1][2][3]`の値」ですが、「2次元配列型`int[2][3]`を要素とする配列の先頭要素をさすポインタ値」へと変換され、評価結果は`int(*)[2][3]`型となります。
|
22
22
|
|
23
|
-
- `a[0]`は「
|
23
|
+
- `a[0]`は「2次元配列型`int[2][3]`の値」ですが、「1次元配列型`int[3]`を要素とする配列の先頭要素をさすポインタ値」へと変換され、評価結果は`int(*)[3]`型となります。
|
24
24
|
|
25
|
-
- `a[0][0]`は「
|
25
|
+
- `a[0][0]`は「配列型`int[3]`の値」ですが、「`int`型を要素とする配列の先頭要素をさすポインタ値」へと変換され、評価結果は`int*`型となります。
|
26
26
|
|
27
|
-
- `&a[0][0][0]`は「要素が`int`型配列の先頭要素をさすポインタ値」です。この式は`int*`型です。(1つ上の`a[0][0]`と同
|
27
|
+
- `&a[0][0][0]`は「要素が`int`型配列の先頭要素をさすポインタ値」です。この式は`int*`型です。(最終結果は1つ上の`a[0][0]`と同じ)
|
28
28
|
|
29
29
|
|
30
30
|
|
31
|
-
C言語のポインタと配列
|
31
|
+
C言語のポインタと配列に関するルールのうち、「"配列型の値"は"配列の先頭要素をさすポインタ値"へと暗黙に変換される」というものがあります。(この分かりにくいルールのせいで、配列とポインタの混同がよく見られます)
|
32
32
|
|
33
33
|
|
34
34
|
|
@@ -36,4 +36,4 @@
|
|
36
36
|
|
37
37
|
|
38
38
|
|
39
|
-
厳格な仕様解釈ではC言語に「多次元配列型」は存在せず、俗にいう3次元配列は「配列型の配列型の配列型」としてCコンパイラに解釈されています。上記のルールを
|
39
|
+
また厳格な仕様解釈ではC言語に「多次元配列型」は存在せず、俗にいう3次元配列は「配列型の配列型の配列型」としてCコンパイラに解釈されています。上記のルールを再帰的に適用していけば、当初の疑問に答えられるかと思います。
|
2
refine
test
CHANGED
@@ -18,13 +18,13 @@
|
|
18
18
|
|
19
19
|
これは厳密には少々誤りを含んでいます。`int a[1][2][3]`のような3次元配列があるとき、それぞれの式の評価結果は **型(type)** が異なっています:
|
20
20
|
|
21
|
-
- `a`は「要素が2次元配列`int[2][3]`型配列の先頭要素をさすポインタ値」
|
21
|
+
- `a`は「要素が2次元配列`int[2][3]`型配列の先頭要素をさすポインタ値」へと変換されます。この評価結果は`int(*)[2][3]`型です。
|
22
22
|
|
23
|
-
- `a[0]`は「要素が1次元配列`int[3]`型配列の先頭要素をさすポインタ値」
|
23
|
+
- `a[0]`は「要素が1次元配列`int[3]`型配列の先頭要素をさすポインタ値」へと変換されます。この評価結果は`int(*)[3]`型です。
|
24
24
|
|
25
|
-
- `a[0][0]`は「要素が`int`型配列の先頭要素をさすポインタ値」
|
25
|
+
- `a[0][0]`は「要素が`int`型配列の先頭要素をさすポインタ値」へと変換されます。この評価結果は`int*`型です。
|
26
26
|
|
27
|
-
- `&a[0][0][0]`は「要素が`int`型配列の先頭要素をさすポインタ値」です。この
|
27
|
+
- `&a[0][0][0]`は「要素が`int`型配列の先頭要素をさすポインタ値」です。この式は`int*`型です。(1つ上の`a[0][0]`と同義)
|
28
28
|
|
29
29
|
|
30
30
|
|
1
update
test
CHANGED
@@ -18,13 +18,13 @@
|
|
18
18
|
|
19
19
|
これは厳密には少々誤りを含んでいます。`int a[1][2][3]`のような3次元配列があるとき、それぞれの式の評価結果は **型(type)** が異なっています:
|
20
20
|
|
21
|
-
- `a`は「要素が2次元配列`int[2][3]`型配列の先頭要素をさすポインタ値」です。
|
21
|
+
- `a`は「要素が2次元配列`int[2][3]`型配列の先頭要素をさすポインタ値」です。この評価結果は`int(*)[2][3]`型です。
|
22
22
|
|
23
|
-
- `a[0]`は「要素が1次元配列`int[3]`型配列の先頭要素をさすポインタ値」です。
|
23
|
+
- `a[0]`は「要素が1次元配列`int[3]`型配列の先頭要素をさすポインタ値」です。この評価結果は`int(*)[3]`型です。
|
24
24
|
|
25
|
-
- `a[0][0]`は「要素が`int`型配列の先頭要素をさすポインタ値」です。
|
25
|
+
- `a[0][0]`は「要素が`int`型配列の先頭要素をさすポインタ値」です。この評価結果は`int*`型です。
|
26
26
|
|
27
|
-
- `&a[0][0][0]`は「要素が`int`型配列の先頭要素をさすポインタ値」です。
|
27
|
+
- `&a[0][0][0]`は「要素が`int`型配列の先頭要素をさすポインタ値」です。この評価結果は`int*`型です。(1つ上の`a[0][0]`と同義)
|
28
28
|
|
29
29
|
|
30
30
|
|
@@ -33,3 +33,7 @@
|
|
33
33
|
|
34
34
|
|
35
35
|
簡単に型`T`の1次元配列`T a[N]`を考えたとき、式`a`自身の型は`T[N]`という「`N`個の`T`型要素からなる配列型」であり、この式の評価結果は「先頭要素`a[0]`をさすポインタ値」つまり ポインタ値`&a[0]`/`int*`型 へと暗黙変換されます。
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
厳格な仕様解釈ではC言語に「多次元配列型」は存在せず、俗にいう3次元配列は「配列型の配列型の配列型」としてCコンパイラに解釈されています。上記のルールを順番に適用していけば、当初の疑問に答えられるかと思います。
|