ページ 11

ポインタの質問

Posted: 2007年2月24日(土) 02:12
by 大工
1次元配列へのポインタと2次元配列って似てるけど違うと良く聞きます。

手持ちの本で解説している部分があるのですがその『差』というグレーゾーンの話ははっきりとは書かれていませんでした。。。

すみません、解説していただけないですか?

Re:ポインタの質問

Posted: 2007年2月24日(土) 03:45
by 管理人
違うというのがよくわかりませんけど、アドレスの配置は以下のようになっています。

int a[5];
と宣言した場合、

aつまりa[0]のアドレスを先頭に[0][1][2][3][4]と連続で用意されます。
例えば
&a[0]が12000だとしたらint型は4バイトなので
12000 12004 12008 12012 12016

という感じで用意されます。
一方2次元配列は

int a[2][2];と宣言した場合

aつまりa[0][0]のアドレスを先頭に[0][0] [0][1] [1][0] [1][1]と連続で用意されます。
例えば
&a[0][0]が12000だとしたらint型は4バイトなので、
12000 12004 12008 12012

という感じで用意されます。
もしご存知でしたらごめんなさい。

それ以外に特定の場所に用意される違いがあるなどの性質がもしあるのでしたら存じません。

Re:ポインタの質問

Posted: 2007年2月24日(土) 09:14
by box
> 1次元配列へのポインタと2次元配列って似てるけど違うと良く聞きます。

いわゆる2次元配列は「配列の配列」です。
つまり、各要素が配列であるような配列です。
一方、1次元配列へのポインタは、当該配列の先頭要素を指すポインタです。
配列とポインタは、あくまで異なる概念です。

ただ、いわゆる2次元配列を関数の引数とする場合、
呼ばれた側では1次元配列へのポインタとして扱います。
int a[3][5]という配列があるとします。これを、ある関数の引数とする際、例えば
void func(int (*arr)[5], int n);
のように宣言します(nは元の配列の第1次元の数)。
func関数には、a[3][5]の他、int b[2][5]やint c[100][5]など、
第2次元が5であるような配列を問題なく渡すことができます。
第2次元、つまり列数が5である配列は、横方向に要素が5つ並んだ図を想像するとよいでしょう。
このとき縦方向、つまり第1次元の数はいくつであるかをfunc関数は直接知ることができません。
そこで、func関数の第2引数として2とか100とかいう、
元の配列の第1次元の数を渡しています。

すでにご存じのことばかりでしたら読み捨ててください。