回答編集履歴

3

refine

2016/06/17 10:41

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -18,17 +18,17 @@
18
18
 
19
19
  これは厳密には少々誤りを含んでいます。`int a[1][2][3]`のような3次元配列があるとき、それぞれの式の評価結果は **型(type)** が異なっています:
20
20
 
21
- - `a`は「要素が2次元配列`int[2][3]`配列の先頭要素をさすポインタ値」へと変換されます。この評価結果は`int(*)[2][3]`型す。
21
+ - `a`は「3次元配列型`int[1][2][3]`の値」です、「2次元配列`int[2][3]`を要素とする配列の先頭要素をさすポインタ値」へと変換され評価結果は`int(*)[2][3]`型となります。
22
22
 
23
- - `a[0]`は「要素が1次元配列`int[3]`配列の先頭要素をさすポインタ値」へと変換されます。この評価結果は`int(*)[3]`型す。
23
+ - `a[0]`は「2次元配列型`int[2][3]`の値」です、「1次元配列`int[3]`を要素とする配列の先頭要素をさすポインタ値」へと変換され評価結果は`int(*)[3]`型となります。
24
24
 
25
- - `a[0][0]`は「要素が`int`型配列の先頭要素をさすポインタ値」へと変換されます。この評価結果は`int*`型す。
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

2016/06/17 10:41

投稿

yohhoy
yohhoy

スコア6191

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]`型配列の先頭要素をさすポインタ値」す。この評価結果は`int(*)[2][3]`型です。
21
+ - `a`は「要素が2次元配列`int[2][3]`型配列の先頭要素をさすポインタ値」へと変換されます。この評価結果は`int(*)[2][3]`型です。
22
22
 
23
- - `a[0]`は「要素が1次元配列`int[3]`型配列の先頭要素をさすポインタ値」す。この評価結果は`int(*)[3]`型です。
23
+ - `a[0]`は「要素が1次元配列`int[3]`型配列の先頭要素をさすポインタ値」へと変換されます。この評価結果は`int(*)[3]`型です。
24
24
 
25
- - `a[0][0]`は「要素が`int`型配列の先頭要素をさすポインタ値」す。この評価結果は`int*`型です。
25
+ - `a[0][0]`は「要素が`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
 

1

update

2016/06/16 12:40

投稿

yohhoy
yohhoy

スコア6191

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]`型配列の先頭要素をさすポインタ値」です。は`int(*)[2][3]`です。
21
+ - `a`は「要素が2次元配列`int[2][3]`型配列の先頭要素をさすポインタ値」です。評価結果は`int(*)[2][3]`です。
22
22
 
23
- - `a[0]`は「要素が1次元配列`int[3]`型配列の先頭要素をさすポインタ値」です。は`int(*)[3]`です。
23
+ - `a[0]`は「要素が1次元配列`int[3]`型配列の先頭要素をさすポインタ値」です。評価結果は`int(*)[3]`です。
24
24
 
25
- - `a[0][0]`は「要素が`int`型配列の先頭要素をさすポインタ値」です。は`int*`です。
25
+ - `a[0][0]`は「要素が`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
 
@@ -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コンパイラに解釈されています。上記のルールを順番に適用していけば、当初の疑問に答えられるかと思います。