Heim >Backend-Entwicklung >C++ >Warum ist die Konvertierung eines Pointer-to-Pointer-to-Non-const in einen Pointer-to-Pointer-to-const in C verboten?
Zeiger-Dereferenzierung: Warum die Konvertierung in „Zeiger zu Zeiger zu Konstante“ verboten ist
In C ist es zulässig, einen Zeiger zu konvertieren -to-non-const auf einen Zeiger auf const. Die Konvertierung von einem Zeiger auf einen Zeiger auf eine Nicht-Konstante in einen Zeiger auf einen Zeiger auf eine Konstante ist jedoch nicht zulässig. Dies wirft die Frage auf: Warum?
Um die Gründe für diese Einschränkung zu verstehen, müssen wir die Dereferenzierung von Zeigern in Betracht ziehen. Bei der Dereferenzierung eines Zeigers auf einen Zeiger stellt dies den Zugriff auf den Wert dar, auf den der innerste Zeiger zeigt. Betrachten Sie zum Beispiel den Code:
int i = 10; int *ptr = &i; int **pptr = &ptr;
Hier ist **pptr äquivalent zu *ptr, was einfach der Wert i ist.
Wenn wir jedoch die Konvertierung in zulassen würden ein Zeiger-zu-Zeiger-zu-Konstante, eine ähnliche Dereferenzierungsoperation würde einen konstanten Wert ergeben. Dies würde zu einer Inkonsistenz führen und die Unveränderlichkeit von Konstantenzeigern zerstören. Zum Beispiel:
char *s1 = 0; const char *s2 = s1; // OK... char *a[MAX]; // aka char ** const char **ps = a; // Error!
Hier ist s2 ein konstanter Zeiger, was bedeutet, dass er nicht auf etwas anderes zeigen kann. Wenn ps jedoch erlaubt wäre, könnten wir es möglicherweise dereferenzieren, um a zu erhalten, und dann den Wert von a ändern, wodurch effektiv der Wert geändert würde, auf den s2 zeigt, was verboten ist.
Um die Integrität von const aufrechtzuerhalten Zeiger verbietet die Sprache die Konvertierung von einem Zeiger auf einen Zeiger auf eine Nicht-Konstante in einen Zeiger auf einen Zeiger auf eine Konstante. Dadurch wird sichergestellt, dass die Unveränderlichkeit von Konstantenzeigern erhalten bleibt und unbeabsichtigte Änderungen an konstanten Werten verhindert werden.
Das obige ist der detaillierte Inhalt vonWarum ist die Konvertierung eines Pointer-to-Pointer-to-Non-const in einen Pointer-to-Pointer-to-const in C verboten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!