• ベストアンサー

2次元配列とポインタ配列の違い

2次元配列とポインタ配列の違いを比較するプログラムを作成したつもりなのですが、下のプログラムの printf("we[%d]=%u\n",i,&we[i][0]); という文がどうやら違うらしいのですが、全く分かりません。 なので、なんとなくでも構わないので分かる方がいらっしゃったらお願いします。 #include<stdio.h> int main(void) { int i; char *we[]={"Monday","Tuesday","Wednesday"}; char ek[][10]={"Monday","Tuesday","Wednesday"}; printf("2次元配列で格納したアドレス\n"); for(i=0;i<3;i++){ printf("ek[%d]=%u\n",i,&ek[i]); } printf("ポインタ配列のアドレス\n"); for(i=0;i<3;i++){ printf("we[%d]=%u\n",i,&we[i]); } printf("ポインタ配列で格納したアドレス\n"); for(i=0;i<3;i++){ printf("we[%d]=%u\n",i,&we[i][0]); } printf("ポインタ配列で格納した文字列\n"); for(i=0;i<3;i++){ printf("we[%d]=\%s\n",i,we[i]); } printf("2次元配列で格納した文字列\n"); for(i=0;i<3;i++){ printf("ek[%d]=\%s\n",i,ek[i]); } return(0); }

質問者が選んだベストアンサー

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

>printf("we[%d]=%u\n",i,&we[i][0]); これも間違いでは無いと思いますが、下記の方がすっきりしてるかも。 printf("we[%d]=%u\n",i,we[i]); we[i] は i+1 番目の文字列のアドレス。 we[i][0] は i+1 番目の文字列の最初の文字。 &we[i][0] は i+1 番目の文字列の最初の文字のアドレスで、 結果は、we[i]と同じですが、少し回りくどい記述ですね。 因みに、下記の二つも同じ結果になると思います。 printf("ek[%d]=%u\n",i,&ek[i]); printf("ek[%d]=%u\n",i,ek[i]);

noname#47478
質問者

お礼

回答ありがとうございます。 わかりやすい解説に感謝します。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

アドレス値を printf で出力するときに %u 使ったらダメだよぉ. ちゃんと %p にしないと.

noname#47478
質問者

お礼

回答ありがとうございます。 初歩的なことを忘れてました。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

> という文がどうやら違うらしいのですが 違っていないです。 &we[i][0]というのは、アドレス空間のどこかに確保した 文字列リテラル "Monday", "Tuesday", "Wednesday" の それぞれの先頭文字のアドレスです。つまり、 &we[0][0] は "Monday" の "M" のアドレス、 &we[1][0] は "Tuesday" の "T" のアドレス、 &we[2][0] は "Wednesday" の "W" のアドレスです。 "Monday" は終端の'\0'を含めて7バイト分の領域を取っています。 したがって、&we[0][0] と &we[1][0] との差は7のはずです。 また、"Tuesday" は終端の'\0'を含めて8バイト分の領域を取っています。 したがって、&we[1][0] と &we[2][0] との差は8のはずです。 配列要素の中身をいろいろ変えてみて、出力がどのように変わるかを 確認してみてはいかがでしょうか。

noname#47478
質問者

お礼

回答ありがとうございます。 とても参考になりました。

関連するQ&A