文字列と配列とポインタ

次に気になったのは,char型の配列又はポインタのconstを付けた時のこと

ご存知のように文字列とは”ダブルクォーテーション”で囲まれたものです。
これを,typeidで型を調べると,char constの配列となると思います。

では,本題に入りまして下記の2つは何が違うのでしょうか?
char * const str1 = “abc”;
char const str2[] = “abc”;

よく言われるのは,
 char * str3 = “abc”;
 char str4[] = “abc”;
こちらのパターン。

 str3 = “”; // OK
 str4 = “”; // エラー
 str3[0] = ‘1’; // OK
 str4[0] = ‘1’; // OK

charの配列は,初期化子で文字列を入れられるだけなので
代入はできません。
ポインタの場合は,アドレスの参照先の値を書き換えるだけなので,
代入する事が出来ます。

では,constをつけるとどうなるのか。

char * const str1 = “abc”;
char const str2[] = “abc”;

 str1 = “”; // エラー
 str2 = “”; // エラー
 str1[0] = ‘1’; // OK
 str2[0] = ‘1’; // エラー

こうなります。
ポインタに対する * const 変数
のような場合,ロックされるのは変数の値(アドレス)なので,
アドレスを書き換える事ができなくなります。
なので,str1 = “”;が出来なくなるんですね。

そして,配列の場合の const 変数
のような場合,ロックされるのは配列の値全てなので,
値を書き換える事ができなくなります。
なので, str2[0] = ‘1’;が出来なくなるんですね。

ちなみに,
 str1[0] = ‘1’; // OK
これですが,
const char * str1 = “abc”; か char const * str1 = “abc”;
と書くことで,ロックする事が出来ます。

comments

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*