• ベストアンサー

ポインタと配列の法則

ポインタと配列の法則がまだ、理解していません。 char *test1[] = { "あいうえお", "かきくけこ" }; と char test2[][20] = { "あいうえお", "かきくけこ" }; は、どちらも正しいでしょうか? 下は、sizeof(test[0])とすると20となりますが、上はなりません。 メモリの格納されている状態など知りたいです。 CではPHPのような var_dump関数は無いのでしょうか?

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

  • ベストアンサー
  • noocyte
  • ベストアンサー率58% (171/291)
回答No.4

下の図は,ひらがな1文字が2バイトの場合です (シフトJISまたはEUC-JP). レイアウトが崩れているので,テキストエディタにコピーして固定幅フォントでご覧ください. test1   ┌───┐    ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ [0]│ ・─┼───→┤ あ │ い │ う │ え │ お │\0│   ├───┤    └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ [1]│ ・─┼──┐ ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐   └───┘  └→┤ か │ き │ く │ け │ こ │\0│            └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘   │   │   ├←┬→┤     ↑ sizeof(test1[0]) test2   ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ [0]│ あ │ い │ う │ え │ お │\0│ │ │ │ │ │ │ │ │ │   ├─┼─┬─┼─┬─┼─┬─┼─┬─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ [1]│ か │ き │ く │ け │ こ │\0│ │ │ │ │ │ │ │ │ │   └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19   ├←─────────────────────────────────────→┤                   sizeof(test1[0])

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

実際に試して見ましょう。cygwinのgccで試しました。 int main() { char *test1[] = { "あいうえお", "かきくけこ" }; char test2[][20] = { "あいうえお", "かきくけこ" }; printf( "%p\n", test1 ); printf( "%p\n", test1[0] ); printf( "%p\n", test1[1] ); printf( "%s\n", test1[0] ); printf( "%s\n", test1[1] ); printf( "-----------------\n"); printf( "%p\n", test2 ); printf( "%p\n", test2[0] ); printf( "%p\n", test2[1] ); printf( "%s\n", test2[0] ); printf( "%s\n", test2[1] ); printf( "-----------------\n"); } このプログラムの実行結果は、 0x22ccb8 0x402000 0x40200b あいうえお かきくけこ ----------------- 0x22cc80 0x22cc80 0x22cc94 あいうえお かきくけこ ----------------- となります。 見て分かるとおり、test1では実際にポインタで「あいうえお」と「かきくけこ」のポインタを保持していますが、test2ではポインタとして文字列のポインタを持っていません。 コンパイラがtest2もポインタ風に処理していますが、実際にはポインタを保持していません。 ですので、 test2[0] = test1[1]; test2[1] = test1[0]; なんてことをするとコンパイラに怒られて、エラーになります。代入すべきポインタ配列が無いですから。 でも、 test1[0] = test2[1]; test1[1] = test2[0]; printf( "%p\n", test1 ); printf( "%p\n", test1[0] ); printf( "%p\n", test1[1] ); printf( "%s\n", test1[0] ); printf( "%s\n", test1[1] ); printf( "-----------------\n"); とすると実行結果は、 0x22ccb8 0x22cc94 0x22cc80 かきくけこ あいうえお ----------------- となり無事代入されています。参照するときは文法上破綻の無いようにコンパイラがポインタとして扱っていると言うことです。

すると、全ての回答が全文表示されます。
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.3
すると、全ての回答が全文表示されます。
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.2

上は sizeof test[0] == 4 くらいですかね?どちらも正しいと思います。 絵が書けないと説明しづらいですね^^; 以下のURLの「4.2 ポインタ配列」を参考までに。 http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=3306532 var_dump のような専用のものは用意されてなくて、自分でそういう関数を書かないといけないと思います(たぶん、簡単に書けます^^)。

すると、全ての回答が全文表示されます。
  • Willyt
  • ベストアンサー率25% (2858/11131)
回答No.1

前者も後者も20バイトの領域が確保されることには代わりはないのですが、前者は頭だけしかアドレス指定をできないのですが、後者はバイト毎のアドレスを指定できるとう違いがあるのです。物理的な格納の仕方は全く同じです。  つまり値を変えようとしたとき、前者は一つでも換えようとすると、全キャラクターを指定しなければならないのに対し、 Array の場合は1バイト(実際には2バイト)毎に値を変えられます。

すると、全ての回答が全文表示されます。

関連するQ&A