char* text = "Hello!"
次のように考えられます。
プログラムの開始時に、長さ 7 の char の配列を作成します
{'H','e','l','l','o','!','\0'}
。最後の 1 つはヌル文字で、その後にそれ以上文字がないことを示しています。[文字列に関連付けられたカウントを保持するよりも効率的です...カウントは、32 ビット整数の場合、おそらく 4 バイトを使用しますが、null 文字は 1 バイト、または Unicode 文字列を使用している場合は 2 バイトです。 . さらに、文字の配列とカウント変数を同時に管理しなければならないよりも、ヌル文字で終わる単一の配列を使用するほうが混乱しません。]
配列の作成と文字列定数の作成の違いは、配列は編集可能で、文字列定数 (または「文字列リテラル」) は編集できないことです。文字列リテラルに値を設定しようとすると問題が発生します: それらは読み取り専用です。
次に、ステートメントを呼び出すたびにchar* text = "Hello!"
、その初期配列のアドレスを取得し、それを変数に貼り付けますtext
。このようなものがある場合は注意してください...
char* text1 = "Hello!";
char* text2 = "Hello!";
char* text3 = "Hello!";
...その後、 の 3 つの個別の配列を作成している可能性が非常{'H','e','l','l','o','!','\0'}
に高いため、これを行う方が効率的です...
char* _text = "Hello!";
char* text1 = _text;
char* text2 = _text;
char* text3 = _text;
ほとんどのコンパイラは、1 つの文字列定数のみを自動的に初期化するほどスマートですが、特定の最適化機能を手動で有効にした場合にのみ初期化するコンパイラもあります。
別の注意: 私の経験delete []
から、文字列リテラルへのポインターを使用しても問題は発生しませんが、実際には削除されないことがわかっているため不要です。