Ich würde gerne ein "polymorphes" Array von Zeigern an eine Funktion übergeben.
Ich kann Folgendes ohne Warnungen tun:
%Vor% gcc scheint automatisch x
auf ein (void*)
zu setzen, was einfach toll ist.
Ich erhalte jedoch eine Warnung, wenn ich Folgendes tue:
%Vor% Meine Frage ist: Warum übergibt (int*)
als (void*)
Argument nicht 'inkompatibel', aber (int**)
als (void**)
Argument ist?
Da alle Zeigertypen dieselbe Größe haben (richtig? es ist eine Weile her, seit ich C benutzt habe), Ich kann immer noch so etwas wie:
%Vor% Der Zweck für alle void-Zeiger ist, dass ich einen Funktionszeiger verwenden kann, der auf Funktionen angewendet wird, die (unten im Stapel) verschiedene Arten von ptr-Argumenten haben: einige nehmen int
-Arrays, andere nehmen double
Arrays usw.
Hinweis: void*
ist generisch. aber void**
ist nicht. Sie können einer void*
-Variablen eine beliebige Adresse zuweisen, aber void**
kann nur die Adresse von void*
-variable zugewiesen bekommen.
oder
%Vor%ist gültig, aber Folgendes ist ein Fehler:
%Vor% Fehler: Zuordnung von int**
zu void**
.
Ja, Sie können Folgendes tun:
%Vor% Verwenden Sie für generische Array-Funktionen einfach void* a
wie folgt:
Sie schreiben diese Funktion besser mit Makros.
Rufen Sie diese Funktion wie folgt auf:
Angenommen int
:
Angenommen char
:
Weil in C kein generischer Zeiger-zu-Zeiger-Typ existiert.
Referenz: C FAQ Frage 4.9
Tags und Links c pointers void-pointers pointer-to-array