Frage

In den folgenden Regeln für den Fall, wenn Array zum Zeiger abfällt:

Ein lvalue [siehe Frage 2.5] des Typ-Array-of-T, der in einem Ausdruck erscheint (mit drei Ausnahmen) in einen Zeiger auf sein erstes Element; Der Typ des resultierenden Zeigers ist Zeiger-T-T.

(Ausnahmen sind, wenn das Array der Operand einer Größe oder eines und eines Operators ist oder ein wörtlicher String -Initialisierer für ein Zeichenarray ist.)

Wie kann man den Fall verstehen, wenn das Array "wörtlicher String -Initialisierer für ein Zeichenarray" ist? Ein Beispiel bitte ein Beispiel.

Vielen Dank!

War es hilfreich?

Lösung

Die drei Ausnahmen, bei denen ein Array nicht in einen Zeiger verfällt, sind die folgenden:

Ausnahme 1. - Wenn das Array der Operand von ist sizeof.

int main()
{
   int a[10];
   printf("%zu", sizeof(a)); /* prints 10 * sizeof(int) */

   int* p = a;
   printf("%zu", sizeof(p)); /* prints sizeof(int*) */
}

Ausnahme 2. - Wenn das Array der Operand der ist & Operator.

int main()
{
    int a[10];
    printf("%p", (void*)(&a)); /* prints the array's address */

    int* p = a;
    printf("%p", (void*)(&p)); /*prints the pointer's address */
}

Ausnahme 3. - Wenn das Array mit einer wörtlichen Saite initialisiert wird.

int main()
{
    char a[] = "Hello world"; /* the literal string is copied into a local array which is destroyed after that array goes out of scope */

    char* p = "Hello world"; /* the literal string is copied in the read-only section of memory (any attempt to modify it is an undefined behavior) */
}

Andere Tipps

Nehmen Sie die Erklärungen an

char foo[] = "This is a test";
char *bar  = "This is a test";

In beiden Fällen ist der Typ des String -Literales "This is a test"IS" 15-Element-Array von Zeichen ". Unter den meisten Umständen werden Array-Ausdrücke implizit vom Typ" N-Element-Array von T "in" Zeiger auf T "konvertiert, und der Ausdruck bewertet die Adresse des ersten Elements des ersten Elements Array. In der Erklärung für bar, Genau das passiert.

In der Erklärung für foo, Der Ausdruck wird jedoch verwendet, um den Inhalt ein anderes Array zu initialisieren, und ist daher und ist daher nicht konvertiert in einen Zeigertyp; Stattdessen die Inhalt der Streichliteral werden kopiert an foo.

Dies ist ein wörtlicher String -Initialisierer für ein Zeichenarray:

char arr[] = "literal string initializer";

Könnte auch sein:

char* str = "literal string initializer";

Definition von K & R2:

Ein String -Literal, auch eine String -Konstante genannt, ist eine Folge von Zeichen, die von doppelten Zitaten wie in "..." umgeben sind. Eine Zeichenfolge hat Typ "Array von Zeichen" und eine Speicherklasse statisch (siehe Par.A.3 unten) und wird mit den angegebenen Zeichen initialisiert. Ob identische String-Literale unterschiedlich sind, ist implementierungs definiert, und das Verhalten eines Programms, das versucht, ein String-Literal zu verändern, ist undefiniert.

Es scheint, als hätten Sie dieses Zitat aus den FAQ comp.lang.c (vielleicht einer alten oder vielleicht der gedruckten Version; sie übereinstimmt nicht ganz mit dem aktuellen Status der Online):

http://c-faq.com/aryptr/aryptrequiv.html

Der entsprechende Abschnitt links zu anderen Abschnitten der FAQ, um diese Ausnahmen zu erläutern. In Ihrem Fall sollten Sie sich ansehen:

http://c-faq.com/decl/strlitinit.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top