Was ist der Unterschied zwischen einem Null-Zeiger und einem Void-Zeiger?

Lesezeit: 5 Minuten

Benutzeravatar von Pavitar
Pavitar

Was ist der Unterschied zwischen a Null Zeiger & a Ungültiger Zeiger?

  • Das sind zwei unterschiedliche Konzepte, man kann sie nicht vergleichen. Was ist der Unterschied zwischen dem Stinktier und dem Mondlicht?

    – qrdl

    27. August 2010 um 6:34 Uhr

  • der Mond* riecht nicht&

    – ansiart

    19. Mai 2011 um 17:35 Uhr


  • @qrdl Der Unterschied zwischen dem Stinktier und dem Mondlicht –> obwohl beide eine dunkle und eine helle Seite haben, wirkt sich das Nichtwissen des Unterschieds auf die Datierung und den Genpool aus.

    – chux – Wiedereinsetzung von Monica

    9. November 2016 um 20:34 Uhr

AnT steht mit Russlands Benutzer-Avatar
AnT steht zu Russland

Null Zeiger ist eine besondere reserviert Wert eines Zeigers. Ein Zeiger beliebigen Typs hat einen solchen reservierten Wert. Formal ist jeder spezifische Zeigertyp (int *, char * usw.) hat seinen eigenen dedizierten Nullzeigerwert. Wenn ein Zeiger diesen Nullwert hat, zeigt er konzeptionell nirgendwo hin.

Ungültiger Zeiger ist ein spezifischer Zeiger Typvoid * – ein Zeiger, der auf einen Datenspeicherort zeigt, der keinen bestimmten Typ hat.

Also noch einmal, Null Zeiger ist ein Wertwährend ungültiger Zeiger ist ein Typ. Diese Konzepte sind völlig unterschiedlich und nicht vergleichbar. Das bedeutet im Wesentlichen, dass Ihre Frage, wie gesagt, nicht genau gültig ist. Es ist, als würde man zum Beispiel fragen: „Was ist der Unterschied zwischen einem Dreieck und einem Auto?“.

  • @Pavitar, Es ist nützlich als Markierung. Zum Beispiel, um einen Zeiger anzuzeigen, dem kein Speicher zugewiesen wurde, oder um das Ende/die Enden einer verketteten Liste zu markieren.

    – Agnel Kurian

    27. August 2010 um 5:54 Uhr


  • Sie können und sollten Nullzeiger verwenden. Wenn beispielsweise malloc keinen Speicher zuweisen kann, gibt es einen Nullzeiger zurück. Es ist eine gute Praxis, Ihre Zeiger nach free() auf null zu setzen, um hängende Zeiger zu vermeiden en.wikipedia.org/wiki/Dangling_pointer

    – Marco

    27. August 2010 um 5:56 Uhr


  • @Pavitar: Die Nullzeigerkonstante ist garantiert ungültig und identifizierbar. Sie können es nicht mit einem gültigen Zeiger verwechseln. Daher kann es als Fehlersignal oder als Markierung dafür verwendet werden, dass keine Daten mehr vorhanden sind oder dass ein Zeiger nirgendwohin zeigt oder ähnliches.

    – David Thornley

    27. August 2010 um 18:22 Uhr

  • “Null-Zeiger” vs. “Null-Zeiger” Ich sehe, Sie verwenden zwei Wörter als beschreibendes Substantiv und ein Wort mit Bindestrich als Adjektivsatz für die Substantiv-Ausnahme. Das sieht und klingt für mein „geistiges Ohr“ richtig, aber ist es tatsächlich grammatikalisch korrekt?

    – Chris Reid

    7. März 2016 um 21:02 Uhr

  • @DavidThornley Detail: Die Nullzeiger konstant ist ein Wert. es könnte den Wert von haben 0 und Art von int. EIN Null Zeiger ist “garantiert, ungleich mit einem Zeiger auf ein beliebiges Objekt oder eine Funktion zu vergleichen”.

    – chux – Wiedereinsetzung von Monica

    9. November 2016 um 20:39 Uhr

Es handelt sich um zwei unterschiedliche Konzepte: “void pointer” ist ein Typ (void *). “Nullzeiger” ist ein Zeiger, der einen Wert von Null (NULL) hat. Beispiel:

void *pointer = NULL;

Das ist ein NULL void-Zeiger.

Benutzeravatar von aaronasterling
aaronasterling

Ein Nullzeiger ist garantiert nicht gleich einem Zeiger auf ein Objekt zu vergleichen. Ihr tatsächlicher Wert ist systemabhängig und kann je nach Typ variieren. Um eine Null zu bekommen int Zeiger, den Sie tun würden

int* p = 0;

Ein Nullzeiger wird von zurückgegeben malloc auf Versagen.

Wir können testen, ob ein Zeiger null ist, dh ob malloc oder eine andere Funktion ist einfach durch das Testen ihres booleschen Werts fehlgeschlagen:

if (p) {
    /* Pointer is not null */
} else {
    /* Pointer is null */
}

Ein void-Zeiger kann auf jeden beliebigen Typ zeigen, und es liegt an Ihnen, wie viel Speicher die referenzierten Objekte zum Zweck der Dereferenzierung und Zeigerarithmetik verbrauchen.

Void bezieht sich auf den Typ. Grundsätzlich ist die Art der Daten, auf die es verweist, unbekannt.

Null bezieht sich auf den Wert. Es ist im Wesentlichen ein Zeiger auf nichts und kann nicht verwendet werden.

Ein Nullzeiger weist auf den Wert hin NULL was typischerweise 0 ist, aber in jedem Fall eine Speicherstelle, die nicht dereferenziert werden kann. Ein void-Zeiger zeigt auf Daten vom Typ void. Das Wort “void” ist kein Hinweis darauf, dass die Daten, auf die durch den Zeiger verwiesen wird, ungültig sind oder dass der Zeiger annulliert wurde.

  • NULL in C ist entweder 0 oder (void *)0und in C++ NULL ist immer 0. Die interne Darstellung der Implementierung für einen Nullzeiger ist jedoch möglicherweise nicht 0 (wie bei allen gelöschten Bits).

    – Traumlax

    27. August 2010 um 6:34 Uhr

Benutzeravatar von hotpaw2
Hotpaw2

Normalerweise zeigt ein Null-Zeiger (der jeden Typs haben kann, einschließlich eines void-Zeigers !) auf:

  • die Adresse 0, gegen die die meisten CPU-Befehlssätze ein sehr schnelles Vergleichen und Verzweigen durchführen können (um beispielsweise auf nicht initialisierte oder ungültige Zeiger zu prüfen) mit optimaler Codegröße/Leistung für die ISA.

  • eine Adresse, auf die Benutzercode nicht zugreifen kann (z. B. in vielen Fällen 0x00000000), sodass das Betriebssystem oder der Debugger ein Programm mit diesem Fehler leicht stoppen oder abfangen kann, wenn ein Code tatsächlich versucht, auf Daten an oder in der Nähe dieser Adresse zuzugreifen.

Ein void-Zeiger ist normalerweise eine Methode zum Schummeln oder Deaktivieren der Compiler-Typprüfung, beispielsweise wenn Sie einen Zeiger auf einen Typ oder einen unbekannten Typ zurückgeben möchten, um ihn als anderen Typ zu verwenden. Zum Beispiel gibt malloc() einen void-Zeiger auf einen typlosen Speicherblock zurück, dessen Typ Sie umwandeln können, um ihn später als Zeiger auf Bytes, kurze Ints, Double-Floats, TypePotatos oder was auch immer zu verwenden.

  • NULL in C ist entweder 0 oder (void *)0und in C++ NULL ist immer 0. Die interne Darstellung der Implementierung für einen Nullzeiger ist jedoch möglicherweise nicht 0 (wie bei allen gelöschten Bits).

    – Traumlax

    27. August 2010 um 6:34 Uhr

Benutzeravatar von JaredPar
JaredPar

NULL ist ein Wert, der für jeden Zeigertyp gültig ist. Es repräsentiert das Fehlen eines Wertes.

Ein void-Zeiger ist ein Typ. Jeder Zeigertyp kann in einen void-Zeiger umgewandelt werden, daher kann er auf jeden Wert zeigen. Dies macht es gut für die allgemeine Lagerung, aber schlecht für den Gebrauch. An sich kann es nicht verwendet werden, um auf einen Wert zuzugreifen. Das Programm muss über zusätzlichen Kontext verfügen, um den Werttyp zu verstehen, auf den sich der void-Zeiger bezieht, bevor es auf den Wert zugreifen kann.

1415850cookie-checkWas ist der Unterschied zwischen einem Null-Zeiger und einem Void-Zeiger?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy