回答編集履歴

2

誤字修正

2020/10/08 08:28

投稿

SaitoAtsushi
SaitoAtsushi

スコア5461

test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- つまり、 `char**` が `void*` に変換されているのでこれを `char **` 以外に変換して扱おうとするのは C としてははっきりした保証のないことをしていることになります。 (レイヤではどうしても必要なこともあるかもしれませんが、避けるのが好ましいですね。)
25
+ つまり、 `char**` が `void*` に変換されているのでこれを `char **` 以外に変換して扱おうとするのは C としてははっきりした保証のないことをしていることになります。 (レイヤではどうしても必要なこともあるかもしれませんが、避けるのが好ましいですね。)
26
26
 
27
27
 
28
28
 

1

実際の挙動の説明を付けた

2020/10/08 08:28

投稿

SaitoAtsushi
SaitoAtsushi

スコア5461

test CHANGED
@@ -11,3 +11,19 @@
11
11
 
12
12
 
13
13
  このような段階を経て `*(char(*)[])word1` は `char*` として解釈されます。 明示したキャストの後に暗黙の型変換が入っているのです。
14
+
15
+
16
+
17
+ ----
18
+
19
+
20
+
21
+ C では関数ポインタ以外のポインタは `void*` へ変換可能であり、元の型へキャストしなおしたときには変換前の値と等しいことが保証されます。 しかし元の型でない型に変換したときにどのような意味を持つかは処理系定義ですので具体的に何が起こるかというのは言語としての理屈を付けることは出来ません。
22
+
23
+
24
+
25
+ つまり、 `char**` が `void*` に変換されているのでこれを `char **` 以外に変換して扱おうとするのは C としてははっきりした保証のないことをしていることになります。 (例レイヤではどうしても必要なこともあるかもしれませんが、避けるのが好ましいですね。)
26
+
27
+
28
+
29
+ ただ、常識的には「配列の先頭要素を指すポインタ」と「配列を指すポインタ」は型が違っていても実体としての値が同じになることはわかると思います。 ですから、配列を指すポインタに `*` を付けて配列の先頭要素を指すポインタにしたら値 (アドレス) としては変わらないという結果が生まれます。