Wenn ein Zeiger auf einen Zeiger NULL ist, ist es dann notwendig, dass der Zeiger auch NULL ist?




pointers (3)

Bedenke, ich habe eine Struktur

typedef struct point_t
{
  int x;
  int y;
}POINT;

Ich erstelle einen Zeiger auf Zeiger für POINT und initialisiere ihn auf NULL .

POINT **ppPoint = NULL;

Sollte *ppPoint auch NULL ?


Die Tatsache, dass es hier zwei Zeigerschichten gibt, ist eigentlich irrelevant. Die Tatsache, dass Ihr äußerer Zeiger in NULL bedeutet, dass es illegal ist, ihn zu dereferenzieren. Daher ist es nicht sinnvoll zu fragen, welchen Wert Sie durch eine Dereferenzierung erhalten würden.

Bedenken Sie:

int *p = NULL; // modern practice would be to use nullptr anyway

if (0 == *p) // this is Undefined Behaviour!
{
    // do something, maybe?
}

Sie fügen nur eine weitere Ebene hinzu, in der Sie anstelle von int point_t* , aber das macht wirklich keinen Unterschied.

Die Sache mit Undefiniertem Verhalten ist, dass alles passieren kann ! Ihr Programm kann abstürzen, oder es scheint zu funktionieren, oder es gibt Ihnen manchmal Datenmüllwerte, oder es kann ...


Ein Nullzeiger zeigt auf nichts . Dies gilt für gewöhnliche Zeiger, Funktionszeiger und Elementzeiger gleichermaßen. Dies gilt auch für Zeiger auf Zeiger.

Daher ist es nicht sinnvoll, über den Wert dessen zu sprechen, worauf es hinweist.


Sie können einen Zeiger mit dem Wert NULL nicht dereferenzieren. Sie können also nicht auf *ppPoint .

Sie können die Adresse einer Variablen mit dem %p Formatierer in einem printf() überprüfen.

printf("Address of ppPoint: %p", *ppPoint);
printf("Address of *ppPoint: %p", *ppPoint);




null