wie zu verwenden void ** pointer, richtig?
Ich versuche, mit einem Doppel - void
pointer, aber ich bin ein wenig verwirrt über die Verwendung.
Ich habe eine struct
enthält eine void **
array.
struct Thing{
void ** array;
};
struct Thing * c = malloc (sizeof(struct Thing));
c->array = malloc( 10 * sizeof(void *) );
Also, Wenn ich zuweisen möchten ein anderes Objekt zu jedem Zeiger, und versuchen Sie, um den Wert abzurufen
//Option 1
*(c->array + index) = (void *) some_object_ptr;
//Option 2
c->array[index] = (void *) some_object_ptr;
dann habe ich eine andere Funktion, die (void *) item
die Punkte um jede Zelle, nicht die some_object_ptr
.
Wenn ich will, um den Wert abzurufen, die Spitzen, von some_object_ptr
,
soll ich tun,
function return type is 'void *' and takes argument 'void *'
//Option 3
return (void**) item
//Option 4
return *((void**)item)?
komisch ist, dass wenn ich in den array die array-subscript-Methode konnte ich nicht verwenden, option 4, option nur 3; und wenn ich *(c->array + index)
konnte ich nur opt.4. und nicht opt.3. ..
Kann jemand bitte sagen Sie mir dazu? Wenn ich alle ungültigen Annahmen, dann könnten Sie das bitte korrigieren Sie mich?
InformationsquelleAutor der Frage in His Steps | 2012-01-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
void **
ist nur ein Zeiger auf einen Zeiger auf Speicher mit einem nicht näher definierten Typ. Sie können nur zu dereferenzieren es einmal (da kann man nicht dereferenzieren einevoid *
). Aber abgesehen davon, es ist im Grunde wie jeder andere Zeigertyp. Wenn es Ihnen hilft, denken Sie an die gleiche Weise, als würden Sie mitint *
.So, in Ihrer speziellen situation, die wir haben:
Dann
array
ist ein Zeiger auf ein ganzes array, während*array
ist ein Zeiger auf das erste element, da es äquivalent ist zuarray[0]
.InformationsquelleAutor der Antwort Sylvain Defresne
Einen quick-Tipp, - Zeiger: wenn Sie Gießen, dann sind Sie wahrscheinlich etwas falsch machen.
Als für Ihre Frage. Ich bin nicht sicher, was
item
ist Ihr problem. In Ihrem ersten Teil haben Sie bereits erfahren, wie Sie Zugang Mitglied im array. Sie könnte es einfach:Wenn Sie müssen die Adresse des pointer auf index:
In den zweiten Teil, den man nicht dereferenzieren Sie den Zeiger (+ option), oder nehmen Sie sich die Adresse von array Ergebnis, da es automatisch dereferenziert.
BEARBEITEN:
Ich denke, ich weiß jetzt, was Sie wollen. Sie haben eine ähnliche Funktion wie mein zweiter oben, aber es ist:
Möchten Sie dereferenzieren den Wert von dieser Funktion zurückgegeben wird, und den Zugriff auf das Objekt. In diesem Fall können Sie nur die Option 4 sicher. Da Sie nicht über den index, können Sie nicht wechseln Sie zu einer anderen Zelle (Sie weiß nicht, ob Sie am Ende des Arrays, oder am Anfang - also keine Zusätze oder Abzüge). Sie können nur beheben, der Fehler der oben genannten Funktion: cast
void **
und dann dereferenzieren:*(void **)item
. Dies wird Ihnen einevoid *
. Wenn Sie möchten, um den Zugriff auf das Objekt wies aus dieser Zelle, Sie müssen gegossen, die auf den korrekten Typ:some_object_ptr *obj = *(void**)item
.InformationsquelleAutor der Antwort vhallac
Die Tatsache, die Sie arbeiten mit
void*
undvoid**
egal, Zeiger-Arithmetik funktioniert immer noch gut, so dass beide Optionen, die Sie schrieb, sind richtig.Hier ein Beispiel:
Da es
void*
Sie können es Zeiger auf was auch immer, nur vergessen Sie nicht, es zu werfen, um original-Typ, bevor Sie es verwenden 😉InformationsquelleAutor der Antwort LihO
Allmächtigen push!
Allmächtigen ziehen!
Achtung verlieren/gewinnen Ziffern
InformationsquelleAutor der Antwort Fabio