teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

修正

2018/02/24 08:00

投稿

aglkjggg
aglkjggg

スコア769

answer CHANGED
@@ -6,14 +6,18 @@
6
6
 
7
7
  つまりこれに対する回答は「必要がある」かどうかと言われると「必ずしも必要ではないケースもある」という回答になる気がします。
8
8
  勿論あるべき姿は変数型の一致したプログラムです。
9
- キャストして合わせるのも問題ありませんが(※1)、私個人としては配列の先頭メモリアドレスをpに代入するという意味で`p = &a[0]`や`p = &balance[0][0]`という書き方が理解しやすい形かと思います。
9
+ キャストして合わせるのも問題ありませんが(※1)、私個人としては配列の先頭メモリアドレスをpに代入するという意味で`p = &a[0]`や`p = &balance[0][0]`という書き方が理解しやすい形かと思います。この書き方の場合型が一致しているのでキャストも不要です。
10
10
 
11
11
  ##### ※1について
12
12
  これらは全て同じ「配列の先頭メモリアドレス」を`p`に代入します。
13
13
  `p = balance`, `p = &balance`, `p = &balance[0]`, `p = &balance[0][0]`
14
14
  どれも正しい「配列の先頭メモリアドレス」を代入している為プログラムは期待通りに動きます。
15
- コンパイル時にエラーまたは警告が出るかもしれませんが。
15
+ しかし、型が一致していない為コンパイル時にエラーまたは警告が出る場合あります
16
+ この点を解決する為にキャストして型を「強制的に一致」させます。
16
17
 
18
+ Cのキャストは強制的なので場合によっては安全でない場合があります。
19
+ C++ではCのような何でも強制的にキャストできてしまうキャストは邪道とされてます。
20
+
17
21
  ##### 余談
18
22
  話が少しズレますが、実際のメモリと配列とポインタの関係については以下の画像を見て頂ければイメージが出来ると思います。
19
23
 

3

情報追加

2018/02/24 08:00

投稿

aglkjggg
aglkjggg

スコア769

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

2

正常パターンを追加

2018/02/24 07:45

投稿

aglkjggg
aglkjggg

スコア769

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  キャストは変数型を一致させる為だけに必要です。
2
- 「エラーになる」か「警告が出るがコンパイルが通る」かはコンパイラ依存になると思います。
2
+ 「エラーになる」か「警告が出るがコンパイルが通る」か「エラーも警告も無し」かはコンパイラ依存になると思います。
3
3
 
4
4
  また、これらは全て同じ「配列の先頭メモリアドレス」を`p`に代入します。
5
5
  `p = balance`, `p = &balance`, `p = &balance[0]`, `p = &balance[0][0]`

1

言い回しを変更

2018/02/24 07:36

投稿

aglkjggg
aglkjggg

スコア769

answer CHANGED
@@ -1,9 +1,9 @@
1
1
  キャストは変数型を一致させる為だけに必要です。
2
2
  「エラーになる」か「警告が出るがコンパイルが通る」かはコンパイラ依存になると思います。
3
3
 
4
- また、これらは全て同じメモリアドレスを`p`に代入します。
4
+ また、これらは全て同じ「配列の先頭メモリアドレスを`p`に代入します。
5
5
  `p = balance`, `p = &balance`, `p = &balance[0]`, `p = &balance[0][0]`
6
- どれも正しい配列のアドレスを代入している為プログラムは期待通りに動きます。
6
+ どれも正しい配列の先頭メモリアドレスを代入している為プログラムは期待通りに動きます。
7
7
  (コンパイル時にエラーまたは警告が出るかもしれませんが。)
8
8
 
9
9
  話が少しズレますが、実際のメモリと配列とポインタの関係については以下の画像を見て頂ければイメージが出来ると思います。