2012-08-30 35 views
5

Co tak naprawdę oznacza słowo "C-string" w C/C++? Wskaźnik do char? Tablica postaci? A może tablica znaków const-pointer/const?Definicja napisów C w C/C++

+0

+1 Jest to ważna kwestia do zrozumienia, a bardzo niewiele osób zadaje sobie pytanie, co to znaczy. –

Odpowiedz

7

"Ciąg C" to tablica znaków zakończona bajtem 0 (znak null). Tablica, a nie jakikolwiek wskaźnik, to string. Zatem, dowolna końcowa podmielina ciągu C jest również ciągiem C. Wskaźniki typu char * (lub const char * itd.) Są często uważane za wskaźniki do ciągów znaków, ale w rzeczywistości są wskaźnikami do elementu ciągu, zwykle traktowanego jako wskaźnik do początkowego elementu ciągu znaków.

+0

Więc wskaźniki do char nie jest ciągiem C? – FrozenHeart

+1

@NikitaTrophimov Nr R ... powiedział bardzo dokładnie: ciąg znaków C to tablica znaków zakończona znakiem "0 \". 'char *' i 'char const *' są często używane w odniesieniu do łańcucha C, ale same nie są ciągami znaków C. –

+0

Dziękuję bardzo! – FrozenHeart

7

Stała lub niezmienna tablica znaków, zakończona końcowym znakiem 0. Więc wszyscy są następujące ciągi 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

Więc tablice i wskaźniki to to samo i oba mogą być traktowane jako ciąg znaków C? – FrozenHeart

+0

@NikitaTrophimov nie, tablice i wskaźniki to nie to samo, ale w prostszych przypadkach wskaźniki można traktować jako tablice i odwrotnie. Przeczytaj tutaj: http://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/ –

+0

Wiem, że wskaźniki i tablice to naprawdę nie to samo. Chciałbym wiedzieć, czy są jakieś różnice między nimi w znaczeniu ciągu C: – FrozenHeart

2

A C-ciąg jest ciągiem znaków, który jest zakończony bajtem 0, inaczej znany jako null terminated string. Dostęp do niej można uzyskać jako tablicę (char[]) lub jako wskaźnik do pierwszego znaku (char *).

W języku C++ istnieje inny typ ciągu o nazwie std::string, który nie musi być zakończony przez 0 bajt. Termin C-string jest często używany przez programistów C++, gdy mają na myśli łańcuch zakończony wartością zerową, a nie typ std::string.

+0

Czy to nie jest "const char *"? – Mahesh

+2

@Mahesh: Nie musi być. –

+0

@Mahesh, To jest tak samo ważne, aby zmienić rzeczy przez dereferencję wskaźnika (może przechodzisz przez postać po znaku i trzeba coś zmienić). 'const char *' powinno się jednak zdecydowanie stosować przy wskazywaniu literałów. Być może to właśnie przekroczyło twoje umysły? – chris

1

Według standardu (C11 §7.1.1), A ciąg jest ciągła sekwencja znaków zakończone włącznie pierwszego znaku null, tj tablicy znaków zakończonego '\0'.