- ベストアンサー
配列についての疑問
- C++で配列について疑問が生じました。特に、配列のサイズ指定についての理解が混乱しています。
- 配列のサイズ指定についての理解が混乱しています。例えば、char型の配列内に日本語文字を格納する場合、サイズ指定はどのように行うべきでしょうか。
- 配列のサイズ指定に混乱があります。char型の配列で、日本語文字を格納する場合、適切なサイズ指定は何でしょうか。また、サイズ指定が正しくない場合、どのようなエラーが発生するのかも知りたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>strout1("こんにちは"); が実行されると char ss[] = "こんにちは"; となり いいえ、そうではありません。 strout1関数の仮引数定義で、char ss[] と配列であるかのように書いても、 つまるところ、渡ってくるのは実引数で指定した文字列の先頭文字のアドレスです。 void strout1(char *ss) であると解釈します。 "こんにちは" の場合でいうと、先頭の "こ" の第1バイトのアドレスです。 strout1(aa); の場合も同じで、aa[] の先頭文字 'a' のアドレスがstrout1関数に渡ります。
その他の回答 (2)
- asuncion
- ベストアンサー率33% (2127/6289)
>char aa[5] = "abcde"; のように宣言してもエラーになります。 a, b, c, d, e の後ろに、文字列終端を示す '\0' があります。これを含めて6バイト必要です。
お礼
そうでした。char型の配列変数に文字列を代入するとき、最後に一文字分'\0' が入るのでした。気がつかせていただき、ありがとうございます。
- asuncion
- ベストアンサー率33% (2127/6289)
main関数での aa[] "こんにちは" この両者は無関係です。 main関数での実引数 aa と strout1関数での仮引数 ss とが関連づいています。 同様に、main関数での実引数 "こんにちは" と strout1関数での仮引数 ss とが関連づいています。
補足
そうだったのですか。 そう考えると strout1("こんにちは"); が実行されると char ss[] = "こんにちは"; となり [] の中に自動的に 10 が入り配列が確保されるということでしょうか? そして "こんにちは" は char aa[10] = "abcde"; のように abcde という文字列を配列変数aaに入れず、直接仮引数のssに入れ、表示しているということでしょうか?
お礼
よく考えてみればchar ss[] と char *ss は同じですね。ポインタで考えてみれば確かに先頭アドレスがstrout1関数に渡されます。配列とポインタはちょっとややこしいですね。親切にお答えいただいて本当にありがとうございました。