はじめに
C言語には文字列を記憶する変数がない。
文字変数はある。
それが__char__。
「キャラ」とか「チャー」とか読む。
charも結局は数字
charは文字を文字コードに変換し、数字として扱う。また、数字を文字に変換し、文字として扱う。
その行き来をさせるための約束事を含んだint型の進化系です。
文字コードとは、文字に1対1で対応する番号をつけて表現する方法のことです。
char型変数に文字を代入するとコンパイルするときに文字コードに対応した数字に置き換えられます。
人間からみて文字で入力されているだけで、機械からすれば数字です。
要するに char型は普通の整数型と全く同じ!!!
ただ、入出力のときに文字に置き換えているだけです。
int main(void)
{
// int型の配列を宣言
int arr[] = {65, 66, 67, 68, 69};
// %dと%cで出力すると?
for(int i =0; i < 5; i++){
printf("%d : %c\n", arr[i], arr[i]);
}
return 0;
}
結果
65 : A
66 : B
67 : C
68 : D
69 : E
文字が数字に、数字が文字に置き換えられましたね。
これがcharの本質です。
文字列は文字変数の配列
C言語では、文字列の最後に特別な値を記憶しておくことで文字列を扱います。
この様な文字を特に__EOS__(End of String)と呼ぶことがあります。
C言語の場合、'\0'がEOSとして扱われます。'\0'は、数値としては0にあたります。
文字列を出力する%sはループ処理
文字列を出力する%sは、先頭のポインタを受け取り、EOSまでを表示するループ処理です。
int main(void)
{
char arr1[] = "aiueo";
char arr2[] = "ai\0ueo";
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
結果
aiueo
ai
'\0'の手前で止まっていますね。
\はエスケープという仕組みで、機械に対する命令なのか、文字としての数字なのかを判断するようになっています。
charとintの本質的な違い:データサイズ
※コメントより指摘いただきました。未定義だそうです。詳しくはコメントを御覧ください
宣言時に確保されるデータサイズが異なります。char型は数値ではありますが、保持できる領域は-128~128まで。それ以上の数値は扱えません。
char
サイズ:1バイト
表現できる値:-128 〜 128
で、この中の一部の値が文字に対応しており、
「文字として表示する」ことで、アルファベット等の文字が表示されます。
int
サイズ:4バイト
表現できる値:-2147483648 〜 2147483647
まとめ
- char型はint型と数値を扱っているという意味で同じ。人間が見て表示するときに置き換えているだけ。
- 違いとしては、確保されるデータサイズが違う。
- 文字列はcharの配列にEOSを足したもの。
参考
文字の扱い方 - 苦しんで覚えるC言語
https://9cguide.appspot.com/14-01.html