文字配列
文字列は "C Programming Language" のような文字の並び、文などのことである。
C言語での文字列の扱い理解する上で、最も大切なことは
「文字列」というデータ形はオリジナルのC言語にはない。
ということである。
ruby や C++、python、Java、JavaScript など、現代的な言語はほぼすべて「文字列」というデータ形(もしくはオブジェクト)を持っている。
「文字列の型がある」というのは、「文字列を一つの物(オブジェクト)として、一つだけの変数で扱える」という意味である。
たとえば、ruby で
a="dog"
b=a
とすれば b を使って a から渡された "dog" という文字列を扱うことができる。(厳密に移すには b = a.dup)
このため、C言語に文字列が無い、というのは「文字列を一つだけの変数で簡単に扱うことができない」ということを意味している。
C言語で ruby と同じようなことがしたいときには
char s [ ] = "dog";
char *t;
t=(char)malloc(sizeof(char) * (strlen(s)+1) ); // メモリの実体を確保
strncpy(t, s, strlen(s)); // 配列全体をコピー
としなければならない。
C言語の文字列は、文字の配列で表す。
さらに C言語の文字列を複雑にしているのは、C言語の配列とポインタの複雑な関係と文字列リテラルの存在にある。
文字列リテラルは、" " でくくられた文字列で「名前のない、文字の配列」を示している。文字列リテラルという名前で誤解されやすいが文字列ではなく、文字の配列である。
code:moji.c
// 文字の配列の例
char buf[]="dog";
ポインタと配列の複雑な関係のため、次のようなこともできて、意味がとりづらい。
code:moji.c
// 文字の配列へのポインタ bufp が配列 "dog" を指す
char * bufp ="dog";
配列 buf[ ] と配列"dog" は全く同一のものとなる。配列"dog"の名前が buf である。
いっぽう 配列へのポインタ bufp は無名の配列"dog"を指すポインタであって、bufpは配列そのものではない。