2012-09-20 12 views
18

文字列リテラルのデータ型について混乱しています。それはconst char *またはconst charですか?洞察は高く評価されます。おかげC++文字列リテラルのデータ型は何ですか?

+0

私の回答を参照してくださいhttp://stackoverflow.com/questions/12451496/what-is-the-data-type-for-a-string/12452097#12452097同様の質問。 – PiotrNycz

+11

これが間違っている人の数で判断すると(const char *と考える)、なぜこれが落選しているのか分からない。回答者の半分が答えを知らないときには、明らかに良い気持ちです。 – WhozCraig

+5

@CraigNelson、私は10代の担当者があまりにも多くの人々が最後の間にそれを間違って取得する方法を見てきました。 – chris

答えて

25

は、それはあなたがの」長さを定義した場合Nは、文字列の長さプラス終了NUL(または文字列の長さだけのためのものですconst char[N]char const[N]として同じものである)であり、文字列 "にはすでにNULが含まれています)。

これは、sizeof("hello") - 1を実行して文字列の文字数を取得できる理由です(埋め込み文字を含む)NULを含む)。それがポインタだった場合は、システム上のポインタのサイズ(常に1を引いた値)になるため、動作しません。

+6

狭い 文字列リテラルのタイプは "array of n const char"です(nは文字列のサイズです)。 静的記憶期間(3.7)* – chris

+1

コメントを投稿する? –

+0

私は叙事詩のフレーミングを見た後、私はこの質問に対して賛辞を表明した。答えは、まあ別の話です。=) – WhozCraig

7

"Hello world"は、const char[12](11文字+ '\0'ターミネーター)である。

L"Hello world"は、const wchar_t[12]です。

そしてC++ 14以降、"Hello world"sstd::stringです。

は、それぞれ、UTF-8、UTF-16およびUTF-32エンコードを指定するC++ 11によって加えu8""u""U""文字列リテラル表記を、注意してください。修飾されていない文字列リテラル(つまり、""L"")のエンコードは、実装定義されています。

関連する問題