2013-10-09 2 views

Antwort

12

Es wird durch den Standard definiert, dass die Art von Stringliterale ist ein Array von char und Arrays automatisch auf Zeiger Zerfall, d.h. char*. Sie müssen es nicht explizit übergeben, wenn Sie es als Argument an printf übergeben, wenn der Spezifizierer 10 verwendet wird.

Seitennotiz: In C++ ist es const char* .


[1] C99 6.4.5: „eine Zeichenkette ist eine Folge von null oder mehr Mehrbyte-Zeichen eingeschlossen in doppelten Anführungszeichen, wie in "xyz" ... ein Array nur ausreichend statischer Speicherdauer und der Länge enthält, um die Sequenz. Für Zeichenkette Literale haben die Arrayelemente Typ char "

[2] C++ 03 2.1 3.4 §1: „ein gewöhnlicher Stringliteral hat Typen‚Array von n const char‘und statischer Speicherdauer“

+1

Ich sehe. Es ist einfach etwas, von dem ich wusste, dass es passieren muss, aber ich war neugierig, wie es umgesetzt wird. ein typedef macht Sinn. – sherrellbc

+0

Ich sehe, Sie werden eine Referenz aus dem C-Standard hinzufügen, aber es ist nicht 'const char * 'unter C. –

+0

@PaulGriffiths: Ja, danke. Ich habe es schon bearbeitet :) – LihO

4

Ihr Verständnis ist, mehr oder weniger korrekt, obwohl der Mechanismus unterschiedlich ist.

Außer wenn es der Operanden der sizeof oder unäre & Operatoren oder ein Stringliteral verwendet wird eine andere Anordnung in einer Erklärung zu initialisieren, um einen Ausdruck vom Typ „N-Element-Array von T“ wird konvertiert (“ Zerfall ") in einen Ausdruck vom Typ" Zeiger auf T ", und der Wert des Ausdrucks wird die Adresse des ersten Elements im Array sein. Dies gilt für alle Array-Typen, nicht nur für String-Literale.

Der Ausdruck "string1" hat "8-Element-Array von char" Typ; in der printf Aufruf ist es kein Operand der sizeof oder unary &-Operatoren, noch wird es verwendet, um ein anderes Array zu initialisieren, so wird es implizit in einen Ausdruck des Typs "Zeiger auf char" , deren Wert die Adresse ist des ersten Charakters.


1. 7 Buchstaben plus der 0-Terminator.
2. Dies ist der Fall in C; In C++ sind String-Literale Arrays von const char, daher wird der Ausdruck in den Typ const char * umgewandelt.

Verwandte Themen