概ね方位不定だが多分割と偏っている
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


C ポインタと二次元配列
2006年08月14日 (月) | 編集 |
炎天下の中、墓参りに行ってきたりした。暑い暑い。
が、盆を過ぎれば暑さも和らぐと言うし、後少しの辛抱だろうよ。
家にも車にもクーラーが無い生活だが頑張って耐えてみせるぜ。

本当に後少し?


ま、それはそれとして、今回はポインタで二次元配列をどうこうしようという話だ。
二次元配列っていうと大体下の表みたいなのを思い浮かべるわけだが

a[0][0]a[0][1]a[0][2]a[0][3]a[0][4]
a[1][0]a[1][1]a[1][2]a[1][3]a[1][4]
a[2][0]a[2][1][a[2][2]a[2][3]a[2][4]
a[3][0]a[3][1]a[3][2]a[3][3]a[3][4]
a[4][0]a[4][1]a[4][2]a[4][3]a[4][4]
a[5][0]a[5][1]a[5][2]a[5][3]a[5][4]

実際物理的なメモリにはどう格納されているのかというと

a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[0][4]
a[1][0]
中略
a[5][4]


こんな風に上から順番に並んでいる。単純ッ

まあ順番に並んでいるお陰か、a[0]とかa[1]とかでそれぞれの行の先頭アドレスを表現出来るわけなのだが(a[0]ならa[0][0]から、a[1]ならa[1][1]から)。



さて、以上を踏まえてポインタで二次元配列を参照するにはどうするか?

int *pa;
pa=a[0];


こうするのである。一次元配列のaに[]つけただけだな。大丈夫なのか。
これでいいのか不安になるが、実際これでa[0][0]のアドレスが代入され、*paでa[0][0]の内容を参照出来るようになるらしい。後はpa++とかでpaを進めれば順番にa[0][1]、a[0][2]…と内容を参照出来るわけだ。
ちなみにa[1]はa[1][0]のアドレスを示すので、

pa=a[1]

とするとpaにa[1][0]のアドレスを代入することが出来、*paでa[1][0]の値を参照することになる。後はpa++で以下同文。
aだけなら配列名aの先頭アドレス、a[i]なら配列aのi行目の先頭アドレス、a[i][j]ならa配列のi行目j列、といったようにそれぞれで意味が異なることに注意だ。

形式はこんなところだな。後は実際にやってみよう。
二次元配列a[ ][ ]のデータをポインタを使って取り出してみる。

何はともあれ、配列を宣言し初期化する。配列名はaでいいや。

static int a[][6]={{18,18,18,15,17,19},
             {19,18,17,18,18,19},
             {18,18,18,19,18,19},
             {-9999}};


データの終わりは-9999にしておいた。
ポインタ変数paを宣言し、二次元配列aのアドレスを代入する。

int *pa;
pa=a[0];


後はデータの終わりになるまで値を取り出し続ければOK。

while(*pa!=-9999){
 printf("%d ",*pa);
 pa++;
}


二次元配列でもメモリ上では順番に、直線状に並んでいるからa[0][0]から進めていけば配列の終わりまでループし続けるっていう寸法だな。

pointer_int_str_sq_test.jpgpointer_int_str_sq_test2.jpg

こんな感じ。分かり易いが面白みはねーなー。
折角なので俺は1行目以降の数値を全部0にしてしまうぜ。

int *pa;
pa=a[1];


第1行以降を云々するってのが目的なのでa[1][0]のアドレスを代入する。
んで、whileのループ文でa[1][0]以降の要素を全部0にしてしまう。

while(*pa!=-9999){
 *pa=0;
 pa++;
}


最後にpa++して次の要素へ進ませる。
これでa[1][0]以降は全部0になったはずなので、後はそれを表示するのみなんだが、二次元配列を表示するのはfor文が便利なのでfor文を使おう。ループ変数iとjを宣言の中に追加しておくことを忘れずに。

for(i=0;i<=2;i++){
 for(j=0;j<=5;j++){
  printf("%3d",a[i][j]);
 }
 printf("\n");
}


これでOK。

pointer_int_str_sq_test3.jpgpointer_int_str_sq_test4.jpg

こんな感じ。


まとめよう。

二次元配列でも物理的には結局順番にデータが格納されている
a[i]というアドレスの指定でi番目の行列の先頭アドレスを代入できる
お好み焼きに剥き海老を入れすぎてはいけない


以上。
暑いし面倒な概念多くて最近はプログラムで遊ぶ余裕も無いぜ。
つまんねー。配列も全角は参照できないみたいだし。
もっと色々覚えないと駄目かねー。
スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。