[Zeiger]Verständnisfrage
-
int sort_func(const void *a, const void *b); int main(int argc, char* argv[]) { int i,j,anz; int name[100]; char antw='j'; do{ clrscr(); scanf("%i",&name[anz]); anz++; if(anz<9) { printf("Weiter?!\n"); antw=toupper(getch()); } }while(anz<9 && antw!='N'); qsort((void *)name, anz,sizeof(name[0]),sort_func); printf("\n"); for(i=0;i<anz;i++) { printf("\n%i",name[i]); } getch(); return 0; } int sort_func(const void *a, const void *b) // <-- { return(*(int*)a-*(int*)b); // <-- }
Warum steht da 2x ein * ? Ich raff das irgendwie nicht
THX
-
Also z.B.
*(int *)a
-
a ist ein void-Pointer. Da a in Wirklichkeit aber auf int zeigt (du sortierst ein int-array), muss er zuerst in einen int-Pointer umgewandelt werden. Dieser kann dann mit dem *-Operator dereferenziert werden.
-
Der ** bedeutet Pointer auf einen Pointer.
-
Hm,
also mit
(int *)a
castet man den void Zeiger zu einem int Zeiger. Das hab ist ja ganz easy. Das was ich nicht verstande habe/verstehe ist halt das Sternchen vor der Klammer. In meinen C Büchern finde ich dazu nichts informatives
btw: Es ist ja afaik nicht das selbe wie
(int)**a
-
wär es so klarer?
int sort_func(const void *a, const void *b) { int * ap, * bp; ap = (int*)a; bp = (int*)b; return *ap - *bp; }
(edit: Hat keiner gemerkt *g*)
-
Der Stern, den du nicht verstehst, dereferenziert, d.h. du erhälst den Wert, auf den den Zeiger zeigt.
-
Achso jetzt wird mir einiges klarer :>
Die Schreibweise mit dem * vor dem eigentlich Cast war mir fremd...
thx, für die Hilfe