これはどのようにして可能ですか?
const char *cp = "Hello world";
私は現在C++プライマーを読んでいて、この例を見つけました(私は非常に初心者です)。
文字列で文字ポインタを初期化できるのはなぜですか?私がこの例を理解できないのは、ポインタが初期化できるのは&+ +オブジェクトのアドレスOR逆参照され、THENに値が割り当てられている場合のみです。
文字列リテラル は、実際には定数文字の配列です(ターミネーターを含む)。
あなたがするとき
const char *cp = "Hello world";
cp
がその配列の最初の文字を指すようにします。
もう少し説明:配列(char
の配列を使用したCスタイルの文字列だけでなく、すべての配列)は、自然にdecays最初の要素。
例
char array[] = "Hello world"; // An array of 12 characters (including terminator)
char *pointer1 = &array[0]; // Makes pointer1 point to the first element of array
char *pointer2 = array; // Makes pointer2 point to the first element of array
配列を使用することは、最初の要素へのポインタを取得することと同じです。したがって、実際にはis演算子のアドレス&
は関係しますが、それは暗示され、明示的には使用されません。
ご存知の方もいらっしゃるかと思いますが、上記でcp
を宣言するときはconst char *
はタイプとして、私の配列例ではpointer1
およびpointer2
非定数プレーンを使用しましたchar *
タイプ。違いは、文字列リテラル用にコンパイラーによって作成された配列がC++ではconstantであり、変更できないことです。そうしようとすると、 undefined behavior が発生します。対照的に、後者の例で作成した配列はnot定数であり、変更可能であるため、そのポインターはconst
である必要はありません。
"Hello world"
は、const char[12]
タイプの読み取り専用リテラルです。最後の要素はNULターミネーター\0
であり、言語が「文字列の終わり」マーカーとして利用することに注意してください。 CおよびC++では、便宜上、"
を使用してリテラルを英数字で囲み、NULターミネーターを追加できます。
pointer decayと呼ばれるメカニズムにより、const char[12]
タイプをconst char*
タイプに割り当てることができます。
ポインタは&+指し示されたオブジェクトのアドレスでのみ初期化できます
int i = 0;
int *pointer = &i;
正しいですが、ポインタを初期化する唯一の方法ではありません。以下の例をご覧ください。
int *pointer;
pointer = (int*)malloc(100 * sizeof(int));
これは、メモリを割り当てることによってポインタを初期化する方法です。
これはどのようにして可能ですか?
"Hello World"
は文字列定数です。このメモリを割り当てる必要はありません。それはコンパイラの仕事です。
ちなみに、C++を使用している場合は、生のポインタではなく常にスマートポインタを使用してください。