- ベストアンサー
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); }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>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]);
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
アドレス値を printf で出力するときに %u 使ったらダメだよぉ. ちゃんと %p にしないと.
お礼
回答ありがとうございます。 初歩的なことを忘れてました。
- asuncion
- ベストアンサー率33% (2127/6289)
> という文がどうやら違うらしいのですが 違っていないです。 &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のはずです。 配列要素の中身をいろいろ変えてみて、出力がどのように変わるかを 確認してみてはいかがでしょうか。
お礼
回答ありがとうございます。 とても参考になりました。
お礼
回答ありがとうございます。 わかりやすい解説に感謝します。