http://ysserve.int-univ.com/Lecture/c2/e_04-04-05.html
http://www.nurs.or.jp/~sug/soft/tora/tora10.htm
いつも混乱するのでメモ。
わかりやすく一言で
・多次元配列はC特有のもの。Javaなどには無い。
・多次元配列は、メモリ上に並んだ領域
・配列の配列やポインタの配列は、配列やポインタを参照するためのポインタを配列にしたもの。Javaの多次元配列はこれに相当する。
原則
・ポインタはアドレスを格納する
・配列の先頭をポインタで表す
・一番右(?)の次元の配列のみポインタに代入できる
なので
int a[3]; int* b; b = a;
とか
int a[2][3]; int* b; b = a[1];
は可能。
二次元配列をポインタで表す
int a[2][3];
a[0][0] = 0; a[0][1] = 1; a[0][2] = 2; a[1][0] = 10; a[1][1] = 11; a[1][2] = 12; int (*b)[3]; //int[3]型(?) を指すポインタ b = a; int *c[2]; //ポインタの配列 c[0] = a[0]; //この場合は、各次元をそれぞれ代入する c[1] = a[1];
ポインタの配列と配列のポインタ
http://homepage2.nifty.com/c-labo/Pointer.html
char *foo[100]; char (*bar)[100];
C/C++言語において、演算子[]は演算子*より高いので、コンパイラは[]を先に解釈します。
つまり、"char *foo[100]"の場合、この宣言の解釈順は以下の通りです。
宣言のうち、最も優先順位が高いのは[]である。つまり、変数fooは「何か」が100個ある配列である。 宣言から[100]を除外する。 宣言の残りは"char* foo"すなわち、charへのポインタなので、「何か」はcharへのポインタである。 よって、変数fooはchar型へのポインタが100個ある配列である。
一方、"char (*bar)[100]"の場合は、
宣言のうち丸かっこの内側が優先順位が高い。 丸かっこの内側は"*bar"なので、この変数barは「何か」へのポインタである。 宣言から"(*bar)"を除外する。 宣言の残りは"char[100]"なので、「何か」はchar型が100個ある配列である。 よって、変数barはchar型100個の配列へのポインタである。
かなり強引な解釈ですが、演算子の優先順位に従って慎重に解釈していけば、特に難しいことはないと思います。
[カテゴリ: プログラミング言語 > C]
[通知用URL]
Tweet
最終更新時間:2014年11月01日 18時52分06秒