# cat cha.c #includeint main(int argc, char *argv[]) { char *c1; c1="a"; printf("c1: %d %s\n", c1, c1); c1++; printf("c1: %d %s\n", c1, c1); c1="hello"; printf("c1: %d %s\n", c1, c1); char c2; c2 = 'a'; printf("c2: %d %c\n", c2, c2); c2++; printf("c2: %d %c\n", c2, c2); c2 = 'c'; printf("c2: %d %c\n", c2, c2); return 0; } # ./a.out x c1: 4196104 a c1: 4196105 c1: 4196116 hello c2: 97 a c2: 98 b c2: 99 c
charというのは「1文字」である。
1文字なので、"hello"とかを代入できない。
上記の例では、c1は char *c1
c2は char c2
と定義(宣言?)している。
注目すべきはc1, c2に代入するときの引用符で、c1は"", c2は''にしている。
ポインタ宣言(という言い方でいいのか)した場合は"", そうでない場合は'' である。
c1に'a'を、c2に"hello"を入れようとするとコンパイルでエラーになる。
char *c1;
としたときはc1はポインタなので、%dで表示するとその内容はアドレスになる。
char c2;
としたときはc2は文字なので、%dで表示するとその内容は文字コードになる。
c1はポインタなので、インクリメントしても未定義の値が表示される。
c2は文字なので、aをインクリメントするとaの次の文字コードであるbが表示される。