Verwendung und Dereferenzierung (void **)

8

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.

    
crockeea 23.09.2013, 04:34
quelle

3 Antworten

5

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.

%Vor%

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:

%Vor%

Sie schreiben diese Funktion besser mit Makros.

Rufen Sie diese Funktion wie folgt auf:

Angenommen int :

%Vor%

Angenommen char :

%Vor%     
Grijesh Chauhan 23.09.2013, 04:41
quelle
2

Weil in C kein generischer Zeiger-zu-Zeiger-Typ existiert.

Referenz: C FAQ Frage 4.9

    
Yu Hao 23.09.2013 04:40
quelle
0

Die kurze Antwort lautet: Alles, was

ähnelt %Vor%

kann übergeben werden, wenn die Parameterdeklaration den Typ void * hat, weil void * generisch ist. Void ** ist jedoch nicht. Das automatische Casting schlägt fehl.

    
Hrishi 23.09.2013 04:47
quelle