p
とq
は両方とも変数です。 p
タイプは「12 の配列char
」q
で、タイプは「ポインタchar
」です。との両方p
にq
自動保存期間があります。つまり、それらはスタックに割り当てられます。
q
はポインタであり、文字列の最初の文字を指すように初期化されます"hello world"
。この文字列は文字列リテラルであり、すべての文字列リテラルには静的な保存期間があります。
p
は配列であるためp
、文字列リテラルで初期化すると、文字p
の配列が宣言され、初期化されると、文字列リテラルの内容が配列にコピーされます。そのため、GetMemory()
が呼び出されると、領域が array のスタックに割り当てられp
、文字列リテラルの内容が"hello world"
その配列にコピーされます。
コードによって動的割り当てが実行されることはありません。
q
は静的記憶域期間を持つ文字の配列へのポインターであるため、関数から安全に戻ることに注意してください。それが指す配列q
は、プログラムの全期間にわたって存在します。p
ただし、p
関数が戻ると は存在しなくなるため、 を返すのは安全ではありません。
"hello world"
の型が であることにも注意してくださいchar const[12]
。C++ には安全でない暗黙的な変換があり、文字列リテラルを文字列リテラルchar*
の最初の文字を指すように変換できます。これは const 修飾を暗黙のうちに削除するため、安全ではありません。const char*
文字は変更できないため、文字列リテラルを処理するときは常に を使用する必要があります。(C++ 言語の最新リビジョンである C++11 では、この安全でない変換は削除されています。)