次に気になったのは,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”;
と書くことで,ロックする事が出来ます。