"Zerfall" bezieht sich auf die implizite Konvertierung eines Ausdrucks von einem Array-Typ in einen Zeigertyp. In den meisten Kontexten konvertiert der Compiler, wenn er einen Array-Ausdruck sieht, den Typ des Ausdrucks von "N-Element-Array von T" in "Zeiger auf T" und setzt den Wert des Ausdrucks auf die Adresse des ersten Elements des Arrays . Ausnahmen von dieser Regel sind, wenn ein Array ein Operand des sizeof
oder ist&
Operatoren oder das Array ein Stringliteral als Initialisierer in einer Erklärung verwendet wird.
Nehmen Sie den folgenden Code an:
char a[80];
strcpy(a, "This is a test");
Der Ausdruck a
ist vom Typ "80-Element-Array von char" und der Ausdruck "Dies ist ein Test" vom Typ "16-Element-Array von char" (in C; in C ++ sind String-Literale Arrays von const char). Beim Aufruf von strcpy()
ist jedoch keiner der Ausdrücke ein Operand von sizeof
oder &
, sodass ihre Typen implizit in "Zeiger auf Zeichen" konvertiert werden und ihre Werte jeweils auf die Adresse des ersten Elements gesetzt werden. Was strcpy()
empfängt, sind keine Arrays, sondern Zeiger, wie im Prototyp zu sehen:
char *strcpy(char *dest, const char *src);
Dies ist nicht dasselbe wie ein Array-Zeiger. Zum Beispiel:
char a[80];
char *ptr_to_first_element = a;
char (*ptr_to_array)[80] = &a;
Beide ptr_to_first_element
und ptr_to_array
haben den gleichen Wert ; die Basisadresse von a. Es handelt sich jedoch um unterschiedliche Typen, die wie unten gezeigt unterschiedlich behandelt werden:
a[i] == ptr_to_first_element[i] == (*ptr_to_array)[i] != *ptr_to_array[i] != ptr_to_array[i]
Denken Sie daran, dass der Ausdruck wie a[i]
folgt interpretiert wird *(a+i)
(was nur funktioniert, wenn der Array-Typ in einen Zeigertyp konvertiert wird), also beide a[i]
und ptr_to_first_element[i]
dasselbe. Der Ausdruck (*ptr_to_array)[i]
wird interpretiert als *(*a+i)
. Die Ausdrücke *ptr_to_array[i]
und ptr_to_array[i]
können je nach Kontext zu Compiler-Warnungen oder -Fehlern führen. Sie werden definitiv das Falsche tun, wenn Sie erwarten, dass sie es bewerten a[i]
.
sizeof a == sizeof *ptr_to_array == 80
Wenn ein Array ein Operand von ist sizeof
, wird es nicht in einen Zeigertyp konvertiert.
sizeof *ptr_to_first_element == sizeof (char) == 1
sizeof ptr_to_first_element == sizeof (char *) == whatever the pointer size
is on your platform
ptr_to_first_element
ist ein einfacher Zeiger auf char.
int a[10]; int b(void);
, dann+a
ist ein int-Zeiger und+b
ein Funktionszeiger. Nützlich, wenn Sie es an eine Vorlage übergeben möchten, die eine Referenz akzeptiert.