web-dev-qa-db-ja.com

文字ポインタC ++の初期化

これはどのようにして可能ですか?

const char *cp = "Hello world";

私は現在C++プライマーを読んでいて、この例を見つけました(私は非常に初心者です)。

文字列で文字ポインタを初期化できるのはなぜですか?私がこの例を理解できないのは、ポインタが初期化できるのは&+ +オブジェクトのアドレスOR逆参照され、THENに値が割り当てられている場合のみです。

5
Federico Nada

文字列リテラル は、実際には定数文字の配列です(ターミネーターを含む)。

あなたがするとき

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*タイプに割り当てることができます。

3
Bathsheba

ポインタは&+指し示されたオブジェクトのアドレスでのみ初期化できます

int i = 0;
int *pointer = &i;

正しいですが、ポインタを初期化する唯一の方法ではありません。以下の例をご覧ください。

int *pointer;
pointer = (int*)malloc(100 * sizeof(int));

これは、メモリを割り当てることによってポインタを初期化する方法です。

これはどのようにして可能ですか?

"Hello World"は文字列定数です。このメモリを割り当てる必要はありません。それはコンパイラの仕事です。

ちなみに、C++を使用している場合は、生のポインタではなく常にスマートポインタを使用してください。

0
Shiu Chun Ming