2017-08-02 24 views
0

これはどのように可能ですか?charポインタの初期化C++

const char *cp = "Hello world";

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

なぜ文字列でcharポインタを初期化できますか?この例を理解することはできません。ポインターは& +オブジェクトのアドレスが指し示されているか逆参照され、次に値が割り当てられているだけです。

+2

'' Hello world "'これは文字列ではありません。それが可能なのです。 – DimChtz

+2

cとC++の文字列はchar要素の配列で、arrayは最初の要素のアドレスと同じです –

+0

これはC文字列です。コアには、変更できない文字の配列だけです。 – StoryTeller

答えて

4

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

あなたは

const char *cp = "Hello world"; 

を行うときは、その配列の最初の文字にcpポイントを作ります。


もう少し説明:配列(Cスタイルのcharの配列を使用して文字列が、すべての配列だけではなく)自然には、彼らの最初の要素へのポインタにを減衰します。配列を使用して

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 

ので、実際には存在し、その最初の要素へのポインタを取得することと同じですアドレス演算子&関与しているが、それは暗示して明示的に使用されていません。あなたの一部として

は、私はタイプとして const char *を使用の上 cpを宣言する際に、注意、および pointer1pointer2と私の配列-例では、私は非定数プレーン char *タイプを使用している場合があります。違いは、コンパイラによって文字列リテラル用に作成された配列が 定数のC++であることです。これらは変更できません。これを試みると undefined behaviorになります。これとは対照的に、後者の例で作成した配列は ではなく、の定数であるため、変更可能であり、そのポインタは constである必要はありません。

+0

非常に親切な男、ありがとう! –

2

"Hello world"は、const char[12]タイプの読み取り専用リテラルです。最後の要素はNULターミネータ\0であり、この言語は「文字列の終り」マーカーとして利用されることに注意してください。 CおよびC++では、便宜上、英数字を囲む"を使用してリテラルを入力することができ、NULターミネータが追加されます。

const char[12]タイプは、ポインタデカイと呼ばれるメカニズムによってconst char*タイプに割り当てることができます。

0

ポインタが唯一のオブジェクトのアドレスが

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

を指摘し、それが正しいのですが、それではない初期化ポインタへの唯一の方法& +で初期化することができます。下の例を見てください。

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

ポインタをメモリに割り当てて初期化した方法です。

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

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

ところで、C++を使用している場合は、常に生ポインタの代わりにスマートポインタを使用してください。