質問: 苦しんでCを読んでchar型は文字列しか表せないとわかっていますが、
回答: >char型は文字列しか表せないとわかっています 違います、char型は整数型の一種です。 1byteですらありません。(1byteで扱うと便利なCPUが多いのでそれ以外を知らないだけ) 整数、文字、文字コード、文字列とは何ですか? C言語で 「文字」「文字列」をどう扱っているのか記します 最も深いレベルでは0,1しか扱えないコンピュータで,文字を扱う為の取り決めが文字コードです ASCII文字コードとかそれを拡張した UNICODE が今のはやりですね ASCII文字コードを入れるのにいろいろ都合が良いのが char型です char型に文字を入れるのではありません、その文字を表す ASCIIコードという整数値を入れるのです (整数型でも数値としての整数を入れるのにいろいろな点で都合がよいのが int型です) 「やぁ太郎さん」「やぁ花子さん」とはコンピュータでも表示したいです 「やぁXさん」を用意して X を「太郎」「花子」と置き換えるというプログラムを書きたいです これを実現する為、C以前の言語では「文字列型」という物が採用されました。 組込型は「組込関数」でしか扱えません、 文字列型変数を扱う為の文字列処理組込関数の数を増やす開発競争になりました 開発競争をみて、デニス・リッチーは考えました、 (最低限のサポートは必要だけど) 処理はユーザーにプログラムしてもらえばいいんじゃねぇ? C言語には、文字列型はありません。(先人が開発したサブルーチン群が標準関数として付属してくる場合が多いですが) Cが登場した頃の謳い文句に「 C言語は、文字列処理が得意である」と言うのがあったんですが 、ちゃんちゃらおかしいですよね、文字列型が無いんですよ! で、文字列をどう扱うか? int main(int argc, char ** argv){ _ char arry[] = "ABCD"; _ char * p; _ _ p = arry; _ _ *(p+1) = 'b'; _ arry[2] = '6'; _ printf("p is <%s>\n", p); _ printf("arry is <%s>\n", arry); _ if ( strcmp(p, arry) == 0) printf( "p and arry is same\n"); _ return 0; } 実行すると p is arry is p and arry is same と表示されます 「 p = arry; 」は、「charへのポインタ p に char型変数の配列 arry の先頭アドレスの値を代入する」が正しい構文解析です でも、「文字列型変数 p に文字列型変数 arry を代入する」に見えるでしょ! デニス・リッチーは、 「文字列型変数を扱っている様に見せる!」 為に、ポインタとか配列とかの仕様を決めたのだと思いますよ 初学者には悪夢でしかない「ポインタの壁」「配列の壁」です 解ってる人には「とても便利」な記法なんですけどね