2017-08-02 2 views
0

Wie ist das überhaupt möglich?Initialisieren eines Zeichenzeigers C++

const char *cp = "Hello world";

ich zur Zeit lese C++ Primer und ich fand dieses Beispiel (Ich bin ein sehr Anfänger).

Warum ist es möglich, einen Char-Zeiger mit einer Zeichenfolge zu initialisieren? Ich kann dieses Beispiel wirklich nicht verstehen, soweit ich weiß, kann ein Zeiger nur mit & initialisiert + die Adresse des Objektes spitz oder ODER dereferenziert und DANN ein Wert zugewiesen werden.

+2

'" Hallo Welt "' Dies ist keine Zeichenfolge. Deshalb ist es möglich. – DimChtz

+2

in C und C++ String ist ein Array von char Elemente und Array-Adresse des ersten Elements gleich –

+0

Es ist ein C-String. Im Kern ist es nur eine Reihe von Zeichen, die Sie nicht ändern können. – StoryTeller

Antwort

4

String literals sind wirklich Arrays von konstanten Zeichen (mit dem einschließenden Terminator).

Wenn Sie

tun
const char *cp = "Hello world"; 

Sie machen cp Punkt auf das erste Zeichen des Arrays.


Ein wenig mehr Erklärung: Arrays (nicht nur C-Strings Arrays von char aber alle Arrays) natürlich zerfällt auf Zeiger auf ihr erstes Element.

Beispiel

char array[] = "Hello world"; // An array of 12 characters (including terminator) 
char *pointer1 = &array[0]; // Makes pointer1 point to the first element of array 
char *pointer2 = array; // Makes pointer2 point to the first element of array 

einem Array ist das gleiche wie ein Zeiger auf das erste Element immer, also in der Tat gibt ist ein Adressoperator & beteiligt sind, aber es ist implizit und nicht explizit verwendet.

Wie einige von euch haben vielleicht festgestellt, wenn cp erklären oben I const char * als Typ verwendet wird, und in meinem Array-Beispiel mit pointer1 und pointer2 ich einen nicht konstanten Ebene char *-Typ verwendet. Der Unterschied besteht darin, dass das Array, das vom Compiler für Zeichenfolgenliterale erstellt wird, Konstante in C++ ist, sie können nicht geändert werden. Der Versuch wird zu undefined behavior führen. Im Gegensatz dazu ist das Array, das ich in meinem letzten Beispiel erstellt habe, nicht konstant, es ist modifizierbar und daher müssen die Zeiger darauf nicht const sein.

+0

Sehr netter Mann, danke! –

2

"Hello world" ist ein schreibgeschütztes Literal mit dem Typ const char[12]. Beachten Sie, dass das letzte Element der NUL-Terminator \0 ist, den die Sprache als "end of string" -Marker ausnutzt. C und C++ ermöglichen es Ihnen, ein Literal mit " einzugeben, das die alphanumerischen Zeichen aus Bequemlichkeit umgibt, und das NUL-terminator für Sie hinzugefügt wird.

Sie sind berechtigt, eine const char[12] Typ in einen const char* Typ durch einen Mechanismus namensZeiger Verfall zuzuordnen.

0

Zeiger kann nur mit & + die Adresse des anvisierten Objekts

initialisiert werden
int i = 0; 
int *pointer = &i; 

Es ist richtig, aber es nicht der einzige Weg, um initialisierten Zeiger. Schauen Sie sich unten an.

int *pointer; 
pointer = (int*)malloc(100 * sizeof(int)); 

So initialisieren Sie Zeiger, indem Sie ihr Speicher zuweisen.

Wie ist das überhaupt möglich?

Es funktioniert, weil "Hello World" eine String-Konstante ist. Sie müssen diesen Speicher nicht reservieren, es ist der Job des Compilers.

Übrigens, verwenden Sie immer intelligente Zeiger anstelle von rohen Zeiger, wenn Sie C++ verwenden.

Verwandte Themen