トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF RSS ログイン

配列とポインタ

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]



  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2014年11月01日 18時52分06秒