1

C ++でこれがあるとします:

char *p = "Apple";

私はこれを行うことはできません:

p[1] = 'w';

しかし、なぜ私はこれを行うことができますか?

p = "OrangeTorange";
4

3 に答える 3

3

Aspは定数文字列リテラルを指しているため、p[1] = 'w';そうすると、読み取り専用の定数である文字列リテラルとその不正な操作 (未定義の動作) を変更しようとしています。

一方、式では、char へのポインターである変数p = "OrangeTorange";の値を変更します。そして、新しいアドレス値をに割り当てることは有効な操作です。新しい文字列リテラルを指し始めます。p pp

さらに追加するには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 *strchar str[]は異なります。それを理解するために読んでください: sizeof(&arr) は何を返しますか?

于 2013-08-15T17:39:00.037 に答える
3

p[1] = 'w'文字列リテラルを変更しようとしていますが、これは違法です。p = "OrangeTorange"に別の文字列リテラルを割り当てているだけpです。これで問題ありません。

于 2013-08-15T17:39:01.463 に答える