これは簡単な質問かもしれませんが、なぜconst char *が指すメモリアドレスを必要としないのですか?
例:
const char* a = "Anthony";
ではなく:
const char *a = // Address to const char
他のタイプと同じように?
これは簡単な質問かもしれませんが、なぜconst char *が指すメモリアドレスを必要としないのですか?
例:
const char* a = "Anthony";
ではなく:
const char *a = // Address to const char
他のタイプと同じように?
回答:
あなたはこの宣言を想像することができます
const char* a = "Anthony";
次の方法
const char string_literal[] = "Anthony";
const char *a = string_literal;
つまり、コンパイラは、文字列を格納する静的格納期間を持つ文字の配列を作成し、配列の"Anthony"
最初の文字のアドレス(配列指定子を最初の文字へのポインタに暗黙的に変換するため)をpointerに割り当てますa
。
以下は、文字列リテラルが文字配列であることを示すデモプログラムです。
#include <iostream>
#include <type_traits>
decltype( auto ) f()
{
return ( "Anthony" );
}
template <size_t N>
void g( const char ( &s )[N] )
{
std::cout << s << '\n';
}
int main()
{
decltype( auto ) r = f();
std::cout << "The size of the referenced array is "
<< std::extent<std::remove_reference<decltype( r )>::type>::value
<< '\n';
g( r );
return 0;
}
プログラム出力は
The size of the referenced array is 8
Anthony
(文字列リテラルを格納する配列の)文字列リテラルのサイズは、文字列に8
終了ゼロ文字 'も含まれているため、同じ\0'
です。
実証プログラムでは、表現
std::extent<std::remove_reference<decltype( r )>::type>::value
式だけで置き換えることができます
sizeof( r )
const charがポイントするためにメモリアドレスを必要としないのはなぜですか?*
します。
のようなC文字列リテラル
"Anthony"
最初の文字のアドレスまで減衰します。ちなみに、BTW; Cの任意の配列が行います。
const char[8]
(C ++ではCである可能性がありますがchar [8]
、不明です)であり、すべての組み込み配列と同様に、値として使用する場合、最初の要素へのポインターに減衰します。
char [8]
C:c-faq.com/ansi/strlitnotconst.html
「なぜ
const char*
メモリアドレスへのポインタが必要ないのですか?」
実際、ポイントするにはメモリアドレスが必要です。
const char* a
平均a
は、文字列リテラルまたは文字定数へのポインタです。
ポインタはメモリ内の特定のオブジェクトを指すポインタの性質であるため、常に指すアドレスが必要です。そう、a
他へのポインタconst char
です。
次のような"Hi My Name is Alfred!"
割り当てによる文字列リテラル:
const char* a;
a = "Hi My Name is Alfred!";
文字列リテラルの最初の要素のアドレスへのポインタに減衰します。
次に、a
文字列リテラルの最初の要素のアドレスによって割り当てられます"Hi My Name is Alfred!"
実行環境に応じてメモリ内の任意の場所に格納できるます。
それは、文字列リテラルが正確に格納されるプログラマーの力ではありません。割り当ては、それぞれのポインタを適切に割り当てて処理することだけです。