#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 が表示されそうな気がするのですが、何故でしょうか?
2次元配列のポインタ標記
Re: 2次元配列のポインタ標記
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に渡されることになります。
規格上は未定義動作になりそうですが、 とすると、中の整数が出力される環境が多いと思います。
この式中では「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に渡されることになります。
規格上は未定義動作になりそうですが、 とすると、中の整数が出力される環境が多いと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)