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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
taku_s
記事: 11
登録日時: 8年前

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

#1

投稿記事 by taku_s » 5年前

#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 が表示されそうな気がするのですが、何故でしょうか?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 5年前

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';
とすると、中の整数が出力される環境が多いと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

taku_s
記事: 11
登録日時: 8年前

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

#3

投稿記事 by taku_s » 5年前

分かりました。
ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る