Frage

Ich lese einige Code in der Ogre3D Implementierung und ich kann nicht verstehen, was eine void * Typ Variable meint. Was ist ein Zeiger auf void in C ++ bedeuten?

War es hilfreich?

Lösung

Ein Zeiger auf void, void* auf jedes Objekt verweisen kann:

int a = 5;
void *p = &a;

double b = 3.14;
p = &b;

Sie können nicht dereferenzieren, Zunahme oder -abnahme, die Zeiger, weil Sie nicht wissen, welche Art Sie zeigen. Die Idee ist, dass void* kann für Funktionen wie memcpy verwendet werden, die Speicherblöcke einfach kopieren um und kümmern sich nicht um die Art, die sie kopieren.

Andere Tipps

Es ist nur ein allgemeiner Zeiger, verwendet, um Daten zu übergeben, wenn Sie den Typ nicht kennen. Sie haben es auf die richtige Art, um zu werfen, es zu benutzen.

Es ist ein roher Zeiger auf eine Stelle im Speicher. Es erlaubt keine Pointer-Arithmetik wie char * oder int *.

Hier einige Anwendungsbeispiele

http://theory.uwinnipeg.ca/programming/node87.html

Es ist ein Zeiger auf alles - nur ein Teil des Speichers, die Sie mit spielen können - könnte ein Objekt sein, könnte ein Zeichen sein. Sie haben zu werfen, etwas Sinnvolles damit zu tun.

Aufbau meiner vorherigen Posting aus ...


ACHTUNG: Alle Speicheradressen hier sind fiktiv. Ich mache sie nur einen Punkt zu veranschaulichen, auf.


Gegeben:

int data[] = {10,11,12};

Wir haben jetzt:

0xffff0000-0xffff0003  with a value of (int)(10)
0xffff0004-0xffff0007  with a value of (int)(11)
0xffff0008-0xffff000b  with a value of (int)(12)

(Ich bin nicht in Gang zu bringen, in Big-Endian-vs Little-Endian Byte-Reihenfolge hier.)

Wenn wir:

int * p = data;

Wir haben jetzt einen anderen Speicherort haben woanders, sagen:

 0xaaaa0000-0xaaaa0003  with a value of (int*)0xffff0000

Wir können p [1] [oder * (p + 1)] beziehen sich auf * (int *) (0xffff0004) [= 11] als sizeof (int) = 4 und 0xffff0000 + sizeof (int) = 0xffff0004.

Wenn wir:

void * v = data;

Wir haben jetzt einen anderen Speicherort haben woanders, sagen:

 0xbbbb0000-0xbbbb0003  with a value of (void*)0xffff0000.

Allerdings Leere hat keine zugehörige sizeof () Informationen. Wir können nicht den Zeiger erhöhen oder zu verringern. Wir können nicht dereferenzieren die Daten in 0xffff0000 gespeichert sind. Wir können nur den Wert als Ausgangsspeicheradresse verwenden.

Wenn wir die Daten gespeichert in (void *) 0xffff0000 verwenden möchten, wir zunächst auf einen geeigneten Typ umwandeln müssen.

Wie gesagt, (void *) ist immer noch sehr nützlich als ein Mittel, um Adressen zu beliebigen Datenstrukturen übergeben. Zum Beispiel memset (). Dabei spielt es keine Rolle, ob ich eine struct tm oder struct sockaddr zero'ing heraus bin. Wir brauchen nur einen Zeiger auf die Struktur und seine Größe.

(Diese Selbstverständlichkeit sollte, aber ... Vorsicht Memset mit einer Klasseninstanz auf Null und, dabei, die virtuelle Zeigertabelle zu überschreiben.)

Ein void-Zeiger kann nicht auf eine Klasse Mitglied in C ++ verweisen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top