int *ptr=&x;
ist eine Einschränkungsverletzung, das heißt ein "Fehler", ungültiger Code. Die C-Sprache unterstützt keine implizite Konvertierung von const int *
in den Typ int *
. Ihr Compiler hat dafür sicher eine Diagnosemeldung ausgegeben.
Nach dieser Diagnosemeldung wird das Verhalten Ihres Programms nicht mehr von der C-Sprache definiert, vorausgesetzt, Ihr Compiler ist irgendwie damit einverstanden, es zu kompilieren. Viele C-Compiler können so konfiguriert werden, dass sie diesen Code nicht kompilieren, selbst wenn sie ihn im Standardmodus akzeptieren.
Sie könnten die Umwandlung erzwingen, indem eine gegossene
int *ptr = (int *) &x;
Verwendung Dies würde die Beseitigung der obigen Einschränkungsverletzung erhalten. Die Compiler müssten nun Ihren Code akzeptieren (mit einigen Vorbehalten). Aber nach dieser Änderung würde der Versuch, ++*ptr
zu tun, undefiniertes Verhalten auslösen, weil es ein Versuch ist, ein const
Objekt zu modifizieren.
Die zweite führt zu * undefiniertem Verhalten *. Sie verwenden einen Zeiger auf nicht-konstantes 'int', um eine Konstante' int' zu ändern. Ein guter Compiler sollte davor warnen und wenn nicht, sollten Sie weitere Warnungen aktivieren. –
Warnung: Die Initialisierung verwirft Qualifier vom Zeigerzieltyp –
Also sollte case2 int const * ptr = & x sein, um das gleiche Verhalten wie in case1 zu erhalten. –