雑記帳

文字リテラルと文字列リテラルについて

※ C言語を深く知らない人によるメモなので、専門の人からするとガバガバな認識の可能性あり。
文字リテラル
'a'
シングルクォーテーションマークで囲われた文字について、それぞれの文字に対応付けられている整数値の生データをそのままビット列として受け取る。また、整数型として扱われる。
(文字と数の対応には様々な規格がある一方、アルファベットに関してはどの文字コードでも ASCII テーブルで与えられている対応に則っているっぽい。故にアルファベットは基本的に文字化けを起こさない?)
以下もう少し踏み込んだメモ
Lプレフィックスがついている場合
L'a'
全体が「unsigned short」として扱われ、一文字当たり「sizeof(unsigned short)」分のメモリを使う。よって文字リテラルの中に入れられるのは恐らく一文字まで。
Lプレフィックスがついてない場合
'blah'
全体が多分「int」として扱われ、一文字当たり「sizeof(char)」分のメモリを使う。全体のサイズに対し、一文字当たりに充てられるメモリサイズが小さいので、文字リテラルの中に複数の文字情報(最大4文字)を詰め込むことができる?
因みに、複数文字が詰め込まれた文字リテラルは multi-charactor literal って云うらしい。
// multi-charactor literal を使用する場合は、エンディアンの問題を気にする必要あり
また、ASCIIテーブルにない文字(1Byteで表現できない文字)を使ったところ、僕の環境では「?(63)」として扱われた。
※この辺は開発環境によってかなりまちまちだと思う
文字列リテラル
"blah"
文字列リテラルは、基本的には文字データをどこかに置いてその文字列データの先頭アドレスを受け取る。また、配列型として扱われる。この時、文字列の最後にNULL文字が挿入される。
配列型とはいえ、文字列リテラルから受け取るのはその配列のアドレスであるため、通常の配列型同様、ポインタで配列の先頭アドレスを受け取れる。
また、配列型なので「sizeof」に文字列リテラルを直接渡せばその配列サイズ「(文字数+1(NULL文字))*sizeof(char)」もしくは「(文字数+1(NULL文字))*sizeof(unsigned short)」を得られ、「("hoge")[2]」はちゃんと「g」を返す。
(配列型なので当たり前か。)
通常の配列型を大きく異なるのは、文字列データの置かれる場所が文字列リテラルの場合はだいぶ特殊な場所になるっぽく、文字列リテラルからデータアドレスをポインタ型の変数で直接受け取る場合、そのデータが置かれているアドレスのデータを書き換えるのは厳禁みたいな記述があった気がする。(詳しく調べてないのでガバガバ)