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 では、この安全でない変換は削除されています。)