回答編集履歴

4

修正

2018/02/24 08:00

投稿

aglkjggg
aglkjggg

スコア769

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  勿論あるべき姿は変数型の一致したプログラムです。
16
16
 
17
- キャストして合わせるのも問題ありませんが(※1)、私個人としては配列の先頭メモリアドレスをpに代入するという意味で`p = &a[0]`や`p = &balance[0][0]`という書き方が理解しやすい形かと思います。
17
+ キャストして合わせるのも問題ありませんが(※1)、私個人としては配列の先頭メモリアドレスをpに代入するという意味で`p = &a[0]`や`p = &balance[0][0]`という書き方が理解しやすい形かと思います。この書き方の場合型が一致しているのでキャストも不要です。
18
18
 
19
19
 
20
20
 
@@ -26,7 +26,15 @@
26
26
 
27
27
  どれも正しい「配列の先頭メモリアドレス」を代入している為プログラムは期待通りに動きます。
28
28
 
29
- コンパイル時にエラーまたは警告が出るかもしれせんが
29
+ しかし、型が一致していない為コンパイル時にエラーまたは警告が出る場合があり
30
+
31
+ この点を解決する為にキャストして型を「強制的に一致」させます。
32
+
33
+
34
+
35
+ Cのキャストは強制的なので場合によっては安全でない場合があります。
36
+
37
+ C++ではCのような何でも強制的にキャストできてしまうキャストは邪道とされてます。
30
38
 
31
39
 
32
40
 

3

情報追加

2018/02/24 08:00

投稿

aglkjggg
aglkjggg

スコア769

test CHANGED
@@ -1,10 +1,26 @@
1
+ ##### 質問への回答
2
+
1
3
  キャストは変数型を一致させる為だけに必要です。
2
4
 
3
5
  「エラーになる」か「警告が出るがコンパイルが通る」か「エラーも警告も無し」かはコンパイラ依存になると思います。
4
6
 
5
7
 
6
8
 
9
+ > データ型にキャストする必要があると参考書には書いてあります.
10
+
11
+
12
+
13
+ つまりこれに対する回答は「必要がある」かどうかと言われると「必ずしも必要ではないケースもある」という回答になる気がします。
14
+
15
+ 勿論あるべき姿は変数型の一致したプログラムです。
16
+
17
+ キャストして合わせるのも問題ありませんが(※1)、私個人としては配列の先頭メモリアドレスをpに代入するという意味で`p = &a[0]`や`p = &balance[0][0]`という書き方が理解しやすい形かと思います。
18
+
19
+
20
+
21
+ ##### ※1について
22
+
7
- また、これらは全て同じ「配列の先頭メモリアドレス」を`p`に代入します。
23
+ これらは全て同じ「配列の先頭メモリアドレス」を`p`に代入します。
8
24
 
9
25
  `p = balance`, `p = &balance`, `p = &balance[0]`, `p = &balance[0][0]`
10
26
 
@@ -13,6 +29,8 @@
13
29
  (コンパイル時にエラーまたは警告が出るかもしれませんが。)
14
30
 
15
31
 
32
+
33
+ ##### 余談
16
34
 
17
35
  話が少しズレますが、実際のメモリと配列とポインタの関係については以下の画像を見て頂ければイメージが出来ると思います。
18
36
 

2

正常パターンを追加

2018/02/24 07:45

投稿

aglkjggg
aglkjggg

スコア769

test CHANGED
@@ -1,6 +1,6 @@
1
1
  キャストは変数型を一致させる為だけに必要です。
2
2
 
3
- 「エラーになる」か「警告が出るがコンパイルが通る」かはコンパイラ依存になると思います。
3
+ 「エラーになる」か「警告が出るがコンパイルが通る」か「エラーも警告も無し」かはコンパイラ依存になると思います。
4
4
 
5
5
 
6
6
 

1

言い回しを変更

2018/02/24 07:36

投稿

aglkjggg
aglkjggg

スコア769

test CHANGED
@@ -4,11 +4,11 @@
4
4
 
5
5
 
6
6
 
7
- また、これらは全て同じメモリアドレスを`p`に代入します。
7
+ また、これらは全て同じ「配列の先頭メモリアドレスを`p`に代入します。
8
8
 
9
9
  `p = balance`, `p = &balance`, `p = &balance[0]`, `p = &balance[0][0]`
10
10
 
11
- どれも正しい配列のアドレスを代入している為プログラムは期待通りに動きます。
11
+ どれも正しい配列の先頭メモリアドレスを代入している為プログラムは期待通りに動きます。
12
12
 
13
13
  (コンパイル時にエラーまたは警告が出るかもしれませんが。)
14
14