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

回答編集履歴

2

配列へのポインタの配列についてとリンク追加

2016/04/06 14:06

投稿

yumetodo
yumetodo

スコア5852

answer CHANGED
@@ -39,4 +39,15 @@
39
39
  int m_arr[12][3];//int[12][3]型
40
40
  int(*)[3] m_arr_p = m_arr;//単なるポインタのコピー
41
41
 
42
- ```
42
+ ```
43
+
44
+ ところでこの時``m_arr``は配列なので常にポインタに読み替えられるのですがこの時の型は``int**``ではなく``int(*)[3]``型です。``int[3]``型の要素へのポインタになるんですね。
45
+
46
+ こういった事情から2次元配列は扱いづらく、一般に配列へのポインタ配列にしたり、1次元配列を多次元配列のように使ったりします。
47
+
48
+ このへんは図を書くといいです。
49
+
50
+ ついでに
51
+ [https://yumetodo.github.io/2015_C_Textbook/c/12array.html](https://yumetodo.github.io/2015_C_Textbook/c/12array.html)
52
+
53
+ をどうぞ。

1

2次元配列についてと3つの例外について追記

2016/04/06 14:06

投稿

yumetodo
yumetodo

スコア5852

answer CHANGED
@@ -12,13 +12,31 @@
12
12
  つまり
13
13
 
14
14
  ```c
15
- int arr[15];
15
+ int arr[15];//int[15]型
16
16
  int* arr_p = arr;//単なるポインタのコピー
17
17
 
18
- arr[1] = 3;
18
+ arr[1] = 3;//arrはint*型として扱われている。
19
- arr_p[1] = 3;
19
+ arr_p[1] = 3;//arrはint*型として扱われている。
20
20
  *(arr + 1) = 3;
21
21
  *(arr_p+ 1) = 3;//この4つは同じ
22
+
23
+ size_t s = sizeof(arr);//3つの例外の一つ。arrはint[15]型として扱われる
22
24
  ```
23
25
 
24
- ということです。
26
+ ということです。
27
+
28
+ なお3つの例外とは、
29
+
30
+ 1. 配列がsizeofの引数となるとき
31
+ 2. アドレス演算子&の引数となるとき
32
+ 3. char型の配列を文字列リテラルで初期値するとき)。
33
+
34
+ です。
35
+
36
+ 2次元配列になっても同じです。
37
+
38
+ ```c
39
+ int m_arr[12][3];//int[12][3]型
40
+ int(*)[3] m_arr_p = m_arr;//単なるポインタのコピー
41
+
42
+ ```