es Stück für Stück auseinander nehmen ...
myFunction nimmt einen Zeiger auf einen Zeiger vom Typ void (das ist ziemlich viel bedeutet, könnte es zu etwas Punkt). Es könnte so etwas wie folgt lauten:
myFunction(void **something);
Alles, was Sie übergeben, muss diesen Typ haben. Du nimmst also die Adresse eines Zeigers und wirfst sie mit (void **), um es zu einem leeren Zeiger zu machen. (Im Grunde strippt es von irgendeiner Idee darüber, worauf es hinweist - worüber der Compiler ansonsten winseln könnte.)
Dies bedeutet, dass & Variable die Adresse (& dies tut) eines Zeigers ist - so Variable ist ein Zeiger. Um was? Wer weiß!
Hier ist eine vollständigere Schnipsel, eine Vorstellung davon zu geben, wie das passt zusammen:
#include <stdio.h>
int myInteger = 1;
int myOtherInt = 2;
int *myPointer = &myInteger;
myFunction(void **something){
*something = &myOtherInt;
}
main(){
printf("Address:%p Value:%d\n", myPointer, *myPointer);
myFunction((void**)&myPointer);
printf("Address:%p Value:%d\n", myPointer, *myPointer);
}
Wenn Sie diese kompilieren und ausführen, es diese Art der Ausgabe geben sollte:
Address:0x601020 Value:1
Address:0x601024 Value:2
Sie können sehen, dass myFunction den Wert von myPointer geändert hat - was nur möglich war, weil die Adresse des Zeigers übergeben wurde.
Das macht Sinn. Aber ich habe noch nie davon gehört, eine Variable eines unbekannten Datentyps zu behandeln. Wie würde CoCreateInstance mit ifaceptr umgehen, wenn es nicht weiß, um welchen Typ es sich handelt. zweitens ist die Void-Größe beliebig für die Größe des ursprünglichen Datentyps. – numerical25
CoCreateInstance erstellt immer einen Zeiger auf ein COM-Objekt und gibt es über den Parameter 'void **' zurück. Sie sagen ihm, welchen Typ Sie wollen, in Form des Parameters 'IID_ISomeInterface', und Sie sind verantwortlich für die korrekte Verwendung von Typecasts, um' void ** 'in etwas zu verwandeln, das Sie verwenden können. –
'CoCreateInstance()' "weiß", welcher Typ der Ausgabezeiger gemäß der Interface-ID sein soll (dafür ist "IID_ISomeInterface" im Beispiel). Außerdem haben ** alle ** Zeiger die gleiche Größe für eine gegebene Architektur (z.B. sind alle Zeiger auf einem 32-Bit-System 4 Bytes, während alle Zeiger auf einem 64-Bit-System 8 Bytes sind). Es gibt keinen "void" -Typ, aber Sie können "void" -Zeiger haben. Es bedeutet im Grunde einen Zeiger auf einen beliebigen Typ. –