Home > Archives > 2011年11月08日

2011年11月08日

多次元配列とポインタのポインタと

時々「配列とポインタは同一視出来る」という説明を聞くのだけど,これって良い説明なのか悪い説明なのかよく分からない.特に,多次元の配列の解説と同時にこの説明があるのはどうなのかなぁとか疑問に思う.1次元の配列を扱う範囲に置いては特に文句はないのだけど.

多次元配列の解説においては,「多次元配列=ポインタのポインタ」という説明になる.仮に float c[10][20] という配列と float **d というポインタがあった場合,この説明では c = d とした以降は c と d がプログラム中で同一に扱えることになる.が,実際には c と d はインクリメントとかデリファレンスの挙動とかが違い,同一視すると痛い目を見る.正しくは,c は 20要素の float 配列のポインタ(float (*)[20]と書くのか?)と同一視出来る程度であって float ** とは別物と.

ということで,下のプログラムを動かすと c と d が別物だとよく分かる.c と e は同じ挙動.

main(){
  float c[10][20], **d, (*e)[20];
  d = c;
  e = c;
  printf("%p %p %p\n", c, d, e);
  printf("%p %p %p\n", c+1, d+1, e+1);
  printf("%d %d %d\n", c == *c, d==*d, e==*e);
}

結果は以下の通り.

0x7fff7bca9320 0x7fff7bca9320 0x7fff7bca9320
0x7fff7bca9370 0x7fff7bca9328 0x7fff7bca9370
1 0 1

Home > Archives > 2011年11月08日

Search
Feeds

Page Top