C ++でこれがあるとします:
char *p = "Apple";
私はこれを行うことはできません:
p[1] = 'w';
しかし、なぜ私はこれを行うことができますか?
p = "OrangeTorange";
Asp
は定数文字列リテラルを指しているため、p[1] = 'w';
そうすると、読み取り専用の定数である文字列リテラルとその不正な操作 (未定義の動作) を変更しようとしています。
一方、式では、char へのポインターである変数p = "OrangeTorange";
の値を変更します。そして、新しいアドレス値をに割り当てることは有効な操作です。新しい文字列リテラルを指し始めます。p
p
p
さらに追加するにはp
、配列を指している 場合p[1] = 'w';
は無効な操作ではないと仮定して、以下のコード例を検討してください。
char str[] = "Apple";
char* p = str; // p points to a array
p[1] = 'w'; // valid expression, not str[1] = 'w' is well valid.
p = "OrangeTorange"; // is valid
// str = "OrangeTorange"; is NOT valid as `str` is not a pointer but array name
ここで、要求された両方の操作が有効です!
注: 2 つの宣言char *str
とchar str[]
は異なります。それを理解するために読んでください: sizeof(&arr) は何を返しますか?
p[1] = 'w'
文字列リテラルを変更しようとしていますが、これは違法です。p = "OrangeTorange"
に別の文字列リテラルを割り当てているだけp
です。これで問題ありません。