Der Hauptgrund dafür ist, weil es nicht erforderlich ist, dass ein Zeiger auf Elemente die gleiche Größe und Darstellung wie einen Zeiger auf Daten.
In der Praxis ist es schwer sich einen Zeiger zu einem Datenelement vorzustellen, das nicht in eine
void*
passen kann, da ein Zeiger auf ein Datenelement wirklich nur einen Offset enthalten muss. Grob gesagt muss ein Zeiger auf ein Datenelement niemals größer sein als ein
size_t
, und ein
void*
muss mindestens so groß wie ein
size_t
sein. Auf der anderen Seite könnte es leicht Bitmuster enthalten, die in einem Zeiger nicht zulässig waren.
In der Tat, wie Steve Jessop darauf hinweist, erfordern Zeiger auf Mitglied zusätzliche Informationen, da, wenn das Mitglied in einer virtuellen Basis ist, sein Offset von der abgeleiteten Klasse abhängt und dynamisch berechnet werden muss, basierend auf zusätzlichen Informationen in der Zeiger.
Allgemeiner kann ein void*
nur einen Zeiger auf Daten enthalten. Es muss so groß wie der größte Datenzeiger sein (normalerweise a char*
), aber Zeiger auf Funktionen und Member Zeiger, können größer sein, und nicht passen (und Zeiger auf Member-Funktionen fast nie passen).
Was ist die Fehlermeldung? –
"typedef struct abc abc;" "Ja wirklich?" –
Ich benutze MSVC2012: Fehler C2440: 'type cast': kann nicht konvertieren von 'char abc :: *' zu 'void *' – Paul