回答編集履歴
2
誤字修正
answer
CHANGED
@@ -10,6 +10,6 @@
|
|
10
10
|
|
11
11
|
C では関数ポインタ以外のポインタは `void*` へ変換可能であり、元の型へキャストしなおしたときには変換前の値と等しいことが保証されます。 しかし元の型でない型に変換したときにどのような意味を持つかは処理系定義ですので具体的に何が起こるかというのは言語としての理屈を付けることは出来ません。
|
12
12
|
|
13
|
-
つまり、 `char**` が `void*` に変換されているのでこれを `char **` 以外に変換して扱おうとするのは C としてははっきりした保証のないことをしていることになります。 (
|
13
|
+
つまり、 `char**` が `void*` に変換されているのでこれを `char **` 以外に変換して扱おうとするのは C としてははっきりした保証のないことをしていることになります。 (低レイヤではどうしても必要なこともあるかもしれませんが、避けるのが好ましいですね。)
|
14
14
|
|
15
15
|
ただ、常識的には「配列の先頭要素を指すポインタ」と「配列を指すポインタ」は型が違っていても実体としての値が同じになることはわかると思います。 ですから、配列を指すポインタに `*` を付けて配列の先頭要素を指すポインタにしたら値 (アドレス) としては変わらないという結果が生まれます。
|
1
実際の挙動の説明を付けた
answer
CHANGED
@@ -4,4 +4,12 @@
|
|
4
4
|
|
5
5
|
ですから `char(*)[]` 型の式に `*` を付けると参照先の `char[]` 型の値を参照したことになり、これは上記の暗黙の型変換のルールによってその配列の先頭要素を指すポインタ、型で言えば `char*` になるということなのです。
|
6
6
|
|
7
|
-
このような段階を経て `*(char(*)[])word1` は `char*` として解釈されます。 明示したキャストの後に暗黙の型変換が入っているのです。
|
7
|
+
このような段階を経て `*(char(*)[])word1` は `char*` として解釈されます。 明示したキャストの後に暗黙の型変換が入っているのです。
|
8
|
+
|
9
|
+
----
|
10
|
+
|
11
|
+
C では関数ポインタ以外のポインタは `void*` へ変換可能であり、元の型へキャストしなおしたときには変換前の値と等しいことが保証されます。 しかし元の型でない型に変換したときにどのような意味を持つかは処理系定義ですので具体的に何が起こるかというのは言語としての理屈を付けることは出来ません。
|
12
|
+
|
13
|
+
つまり、 `char**` が `void*` に変換されているのでこれを `char **` 以外に変換して扱おうとするのは C としてははっきりした保証のないことをしていることになります。 (例レイヤではどうしても必要なこともあるかもしれませんが、避けるのが好ましいですね。)
|
14
|
+
|
15
|
+
ただ、常識的には「配列の先頭要素を指すポインタ」と「配列を指すポインタ」は型が違っていても実体としての値が同じになることはわかると思います。 ですから、配列を指すポインタに `*` を付けて配列の先頭要素を指すポインタにしたら値 (アドレス) としては変わらないという結果が生まれます。
|