C++ 多次元配列へのポインタ 書いて覚えるための初心者自己中記事
通常の配列へのポインタはそのまま行ける。
二次元配列からは普通じゃいけない。
int array[3][5]; int* p = array;
これはエラーになる。
int array[3]; int* p = array;
ふつうの配列でこうやるけど、配列名はそのまま先頭要素のアドレスなので、
int array[3]; int* p = &array[0];
これと同じ。
最初にやろうとした二次元配列
int array[3][5];
これは、「int型5要素の配列」を1要素としたときの3要素の配列。
typedefを使うと分かりやすいらしい。
typedef int Int5[5]; Int5 array[3];
よくわからないですね。
typedefで「int」を「Int5」と名付ける。この「Int5」は要素を5つ持っている。
という意味になるのか?
「Int5[5]」こういう名前になるんじゃないのか。
しれっと書いてあるからなぁ。
多分そういうことだろう。
でその5要素持っている「Int5」という型を3要素の配列でオブジェクトにする。ということか。
typedef int Int5[5]; Int5 array[3]; Int5* p = array;
でもこれどうやって要素の中身見れるんだ?
int array[3][5] = { {0,1,2,3,4,}, {5,6,7,8,9,}, {10,11,12,13,14,} }; typedef int Int5[5]; Int5* p = array; cout << p[2][3] << endl;
おぉ、呼び出しはそのままか。
これをtypedefを使わずに行うには
int(*p)[5]; p = array;
* と 変数名を囲っちゃえばいい。
さっきまでのtypedefの時と意味は変わらない。
int型5要素へのポインタ。
引数の場合。
void Hoge(int(*p)[5]); int main() { int array[3][5] = { {0,1,2,3,4,}, {5,6,7,8,9,}, {10,11,12,13,14,} }; int (*p)[5]; p = array; Hoge(p);
おなじで行ける。
さらに
void Hoge(int p[][5]);
これでもいける。
そもそもこれが同じだから。
void Hoge(int p[]); void Hoge(int *p);
で、二次元配列でさえ、二番目の要素数と同じ要素を持った配列のポインタを用意しないといけないわけだが、多次元とかめんどくさい?
解決方法が2つあるらしい。
1つ目は多次元を1次元にまとめて、取り出すときに多次元っぽくする。
2つ目はポインタの配列を作る方法?
int* parray[] = { array[0], array[1],array[2], };
とし、このparrayを渡すのです???
何を言っているんだ・・・。
array[0], array[1],array[2],
これらはすべて5要素int型の配列です。と書いてある。
あ、そっか、さっき作った配列がこれか。
ポインタの配列要素にそれぞれ5要素int型の配列を入れているということかな。この場合parrayはあくまで1次元配列ということになるらしい。
ポインタの配列って勉強したかな・・・。あれ?混乱してる。
これを、使う場合は
cout << parray[1][2] << endl;
ふつうにこう使うのか。
引数で受け取るときは
void Hoge(int** pp) { }; int main() { int array[3][5] = { {0,1,2,3,4,}, {5,6,7,8,9,}, {10,11,12,13,14,} }; int* parray[] = { array[0], array[1],array[2], }; Hoge(parray);
ポインタのポインタ?で受け取れる。
ここまで。