ページ 11

2次元配列のポインタ標記

Posted: 2018年11月30日(金) 22:05
by taku_s
#include <iostream>
using namespace std;

int main(){
int data[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
cout << *(data[ i ]+j) << '\t';
}
cout << endl;
}
return 1;
}
これを
cout << *(data+(i*3)+j) << '\t';
にするとアドレスが表示になってしまいます。
1 2 3 が表示されそうな気がするのですが、何故でしょうか?

Re: 2次元配列のポインタ標記

Posted: 2018年11月30日(金) 22:23
by みけCAT
dataは「int型の要素3個の配列」の配列なので、
この式中では「int型の要素3個の配列」へのポインタになります。
したがって、これに1を足すと次の「int型の要素3個の配列」を指すことになります。
(i*3)もjも整数であり、整数を足してもデリファレンスする効果は無いので、
data+(i*3)+jはdataが指す「int型の要素3個の配列」の((i*3)+j)個先の
「int型の要素3個の配列」を指すことになります。
これを*(data+(i*3)+j)としてデリファレンスすると、「int型の要素3個の配列」になるので、
配列の先頭要素のポインタがcoutに渡されることになります。

規格上は未定義動作になりそうですが、

コード:

cout << *((int*)data+(i*3)+j) << '\t';
とすると、中の整数が出力される環境が多いと思います。

Re: 2次元配列のポインタ標記

Posted: 2018年12月01日(土) 07:21
by taku_s
分かりました。
ありがとうございました。