Hi! On Monday 09 December 2002 22:42, David Haller wrote:
Hallo,
<mode type="AFAIK|AFAIR">
On Mon, 09 Dec 2002, Thorsten Haude wrote:
* Sebastian Huber
[02-12-09 20:16]: Thorsten Haude
schrieb am 09.12.02 18:55:38: ich versuche gerade, etwas Code zu verschönern, dabei stellt sich mir folgende Frage: Was ist der Unterschied zwischen (einTyp*) 0
Hier hast du eine explizite Typkonvertierung (Cast) von einem Integerliteral zu einem einTyp-Zeiger.
Das verstehe ich.
Ist aber nur bedingt richtig. Wie ich neulich gelesen habe, ist NULL (auch und gerade(!) wenn es als (void*)0 definiert ist) nicht unbedingt ein Zeiger auf die Speicheradresse 0.
Das ist schon exakt richtig. Es ist ein expliziter Cast von einem Integerliteral zu einem einTyp-Zeiger. Dass sich das Bitmuster von Integer 0 und Zeiger 0 unterscheiden kann, ist, wie du ja auch schreibst, moeglich, aber egal. So was passiert ja auch bei der Umwandlung von int nach float.
Definiert ist nur, dass (in C(!)) ein Cast von 0 zu einem Pointer einen ("den") ungueltigen Zeiger zu ergeben hat, der je nach Architektur u.U. eben nicht "0x0" ist. Ein Vergleich von (void*)0 == (int)0 bzw. ptr == 0 muss aber (IIRC) uebrigens "Wahr" ergeben (wenn ptr == NULL bzw. wenn ptr ungueltig ist)...
Dieses Verhalten muss durch die Implementation des Compilers gewaehrt werden.
NULL
Hier hast du eine implizite Typkonvertierung von einem void-Zeiger (bei neuern Standard- bibliotheken) mit dem Wert 0 zu einem einTyp-Zeiger. Ich würde diese Version wählen, bei C++ ist eigentlich die blose '0' üblich.
s.o. casts von 0 auf Zeiger bzw. Vergleiche von Zeigern mit 0 (oder indirekt ueber ein NULL, z.B. eben (void*)0) haben obiges Verhalten zu zeigen -- egal auf was nun der Zeiger zeigt / mit was verglichen wird.
Das nicht. Wo wird hier konvertiert, außer von 0 zu (void*) 0 ?
s.o. "per definitionem" muss es egal sein. Allerdings macht es einen (semantischen(?)) Unterschied, ob nun explizit zwei Pointer (ptr == (void*)0) oder mit implizitem cast (ptr == 0) verglichen (oder zugewiesen) wird.
In der Praxis auf x86-Hardwaere macht es allerdings AFAIK keinen Unterschied, da der "ungueltige Zeiger" eben (AFAIK) als ein Zeiger auf die Adresse 0x0 definiert ist, d.h. auch im Maschinencode wird mit 0 verglichen/zugewiesen ;) Auf anderer Hardware kann das aber durchaus anders sein -- das Verhalten in C (und C++) muss aber das gleiche sein, der Compiler muss dort eben passenden Code erzeugen.
Der Vergleich ptr == NULL ist IMO vorzuziehen, sofern die Implementation ein NULL bietet. Ansonsten sollte man wohl NULL selber zu (void*)0 definieren, um explizit Pointer mit einem Pointer zu vergleichen.
</mode>
-dnh