1. ダブルクォーテーションで括った文字列はNULLターミネートされたchar型配列
となってメモリ中に置かれ、その領域の先頭へのポインタとなる。

2. シングルクォーテーションで括った文字は char の値となる。

3. Lが先頭に付いているシングルクォーテーションで括られた文字(例 L'あ')は
wchar_t 型の値となる。wchar_t 型のビット数や使用するエンコーディングは
環境によって違うが、だいたいの場合は何の文字でも表せるようになっている。
(例: GCCのCでは32bitでUnicodeのUCS4)。

4. Lが先頭に付いているダブルクォーテーションで括られた文字列(例 L"あいう")は
NULLターミネートされたwchar_t型配列となってメモリ中に置かれ、その領域の
先頭へのポインタとなる。

5. wchar_t 型から char 配列への変換は mbtowc(), NULLターミネートされた
wchar_t 配列から char配列への変換は mbstowcs(), NULLターミネートされた
char 配列から wchar_t 型への変換は wctomb(), NULLターミネートされた
char 配列から wchar_t 型配列への変換は mbstowcs() を使用する。また、
これらの変換を行うためには setlocale() で適切なロケールを設定しておく
必要がある(UNIX系OSでは setlocale(LC_ALL, "") などとすると環境変数から
値を拾って勝手に設定してくれる)。


ということで、エンコーディングに関係なく1文字単位で処理をしたい場合は
wchar_t 型に変換してから行った方が楽。そんなことしないでただ保持して
出力するだけという場合は char のままでもいいが、char のビット数を
オーバーする文字だった場合は char 配列でないと保持しておくことができ
ないかも知れない。しかしビット数については環境依存であるため、ある
エンコーディングで16ビットになる文字も char 変数一つで扱えるかも
知れない(しかしそれに期待して書かれたプログラムは移植性がなくなる)。