C言語では文字列型という型はありません。どのようにして文字列を扱うかというと、文字の配列という形で扱います。
例えばこのような文字列定数は文字の配列です。
C言語の文字配列について説明しています。
C言語では文字列型という型はありません。どのようにして文字列を扱うかというと、文字の配列という形で扱います。
例えばこのような文字列定数は文字の配列です。
"This is a pen."
配列の内容は下記のようになっています。
'T' | 'h' | 'i' | 's' | ' ' | 'i' | 's' | ' ' | 'a' | ' ' | 'p' | 'e' | 'n' | '.' | '¥0' |
最後の'¥0'は文字列の終わりを示すためにつけられます。これがないとどこまでが文字列かが判別できないためです。そのため文字列のためにとられるメモリの大きさは文字の数に1を足した数になります。このことを忘れて、文字数分しかメモリを確保していない配列に文字列をコピーしてしまうとバッファオーバーフローを起こしてしまいますので気をつけましょう。
次のように文字列定数を関数の引数に渡した場合、関数は文字配列の先頭へのポインタを受け取ります。
printf("This is a pen.");
また、下記の文で変数pには文字列定数"This is a pen."の文字配列の先頭へのポインタが入ります。pが指している文字列は定数なので内容を変えることはできません。変更した場合、結果は不定となります。
char *p = "This is a pen."
上記の例は、配列の初期化で文字列定数を使う場合と似ていますが意味は違います。
char s[] = "This is a pen."
配列sには、初期値となる"This is a pen."と'¥0'が、それらがちょうど収まるだけのメモリが割り当てられ、その中にコピーされます。ですので配列sの個々の要素(文字)は変更可能です。