2012-08-30 11 views
5

実際にはC/C++で "C-string"という単語が意味するものは何ですか? charへのポインタ?文字の配列ですか?または、const-pointer/constの文字配列ですか?C/C++でのC-ストリングの定義

+0

+1これは理解する上で重要な問題であり、実際には何を意味するのか気になる人はほとんどいません。 –

答えて

7

"C文字列"は、0(ヌル文字)バイトで終わる文字の配列です。配列ではなく、ポインタはの文字列です。したがって、C文字列の任意の末端部分配列もまたC文字列である。 char *(またはconst char *など)のポインターは、しばしば文字列のポインターと見なされますが、実際には文字列の要素へのポインターで、通常文字列要素へのポインターとして扱われます。

+0

charへのポインタはC-文字列ではありませんか? – FrozenHeart

+1

@NikitaTrophimov No. R ...それは非常に正確に言った:Cの文字列は '\ 0 'で終わる文字の配列である。 'char *'と 'char const *'はC文字列を参照するために使われることが多いですが、それ自体はC文字列ではありません。 –

+0

ありがとうございます! – FrozenHeart

7

constまたは非constの文字配列。末尾の0文字で終了します。だから、次のすべてがCの文字列です:

char string_one[] = { 'H', 'e', 'l', 'l', 'o', 0 }; 
char string_two[] = "Hello"; // trailing 0 is automagically inserted by the compiler 
const char *string_three = "Hello"; 
+0

配列とポインタは同じものなので、どちらもC文字列として扱うことができますか? – FrozenHeart

+0

@NikitaTrophimovいいえ、配列とポインタは同じではありませんが、単純な場合はポインタを配列として扱うことができます。ここをクリックしてください:http://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/ –

+0

私はポインタと配列が本当に同じものではないことを知っています。私は知りたいのですが、C-stringの意味でそれらの間に違いがあります – FrozenHeart

2

C-stringは、そうでない場合はnull terminated stringとして知られて0バイトで終了された文字のシリーズです。配列(char[])または最初の文字(char *)へのポインタとしてアクセスできます。

C++には、std::stringという別の種類の文字列があり、0バイトで終了する必要はありません。 C-stringという用語は、C++プログラマがstd::string型ではなくヌル終了文字列を意味する場合によく使用されます。

+0

'const char *'ではありませんか? – Mahesh

+2

@Mahesh:そうである必要はありません。 –

+0

@Mahesh、ポインタを逆参照することで物を変更するのと同じように有効です(多分、あなたはキャラクターを通り抜けて何かを変更する必要があります)。しかし、 'const char *'はリテラルを指し示す際には必ず使われるべきです。多分それがあなたの心を越えたのでしょうか? – chris

1

標準(C11§7.1.1)によれば、ストリングはによって終了文字の連続した配列であり、最初のヌル文字、'\0'によって終了文字のすなわちアレイを含みます。