2010-11-13 12 views
11

ich irgend C++ Code war auf der Suche, und ich sah dies:int num = * (int *) Nummer; Was macht das?

int num = *(int *)number; 

ich vorher noch nie gesehen hatte? war es in einer Funktion als solche gekennzeichnet:

void *customer(void *number){ } 

Was bedeutet das auch? Gibt es eine andere Möglichkeit, dies zu zeigen?

Danke, das ist keine Hausaufgaben btw Ich war nur verwirrt was das tut?

Antwort

11

Der (int *) Teil wandelt die Variablennummer in einen Zeiger auf ein int, dann das * vor dereferenziert es zu einem int.

+0

+1 @Charles yep, im Grunde wird num jetzt eine Kopie des Werts enthalten, auf den die Nummer zeigt. – pstrjds

+0

Es lohnt sich, hinzuzufügen: Während wir FROM void pointer verwenden, müssen wir die cast-Operatoren verwenden. Dies ist der Grund für die Verwendung von (int *), die 'Nummer', die Zeiger auf void ist, auf einen Zeiger auf einen int. Und * diesen Zeiger weiter auf einen int ablenken, um einen int zurückzugeben. –

10

Die Funktion nimmt eine void*, aber irgendwie weiß es (vielleicht ist es in irgendeiner Dokumentation irgendwo erforderlich), dass der Zeiger, den es gegeben wird, tatsächlich auf eine int zeigt.

So (int*)number ist „der ursprüngliche Zeiger auf ein int* umgewandelt, so dass ich eine int aus lesen kann“, und *(int*)number ist der int-Wert, dass es auf die Punkte.

1

Die Funktion akzeptiert einen void-Zeiger (also void *). Um es auf eine Variable eines bestimmten Typs (zB int) zu dereferenzieren - was das erste "*" tut - müssen Sie es in einen Zeiger auf einen tatsächlichen Typ umwandeln - in diesem Fall in einen int Zeiger über (int *) gegossen

1

ich gehe davon aus customer wie folgt verwendet:

int lookup = 123; 
customer_key *key = customer(&lookup); 
// do something with key here 

in diesem Fall wird der Code in den Kunden ein int * die void * zu typecasting und dereferencing es dann (sie Wert immer). Es muss zuerst tippen, weil void * im Grunde bedeutet "Zeiger auf etwas", mit dem Sie in jeder beliebigen Art übergeben können. Ohne die Typumwandlung weiß der Compiler nicht, ob Sie eine char (normalerweise 1 Byte), eine short (normalerweise 2 Byte) oder eine int (normalerweise 4 Byte) lesen möchten. Die Typumwandlung beseitigt die Mehrdeutigkeit.

Hinweis void * für das Argument ist wahrscheinlich nicht die beste, da Sie tun können: (! A double ist keine int)

double lookup = 69.0f; 
customer_key *key = customer(&lookup); 

Und dies wird kompilieren, aber nicht sehen Kunden 69 .

Die Verwendung von void * kann absichtlich sein, der Code kann (hoffentlich sicher) zwischen Zeigern und einem Argument wie: (void *)3 bestimmen - was ein Sonderfall wäre.

1

Die richtigen Antworten sind schon da, aber kann ich dir einen Trick nennen, der mir generell geholfen hat, wenn ich viel C benutzen musste?

Es ist wie Sie "*" in Ihrem Kopf aussprechen - und es gibt zwei Teile.

Der gemeinsame Teil ist, wenn es Teil eines Typs ist - und jeder sagt wahrscheinlich "Zeiger", wenn sie das lesen, was großartig ist. Also (int *) ist ein int-Zeiger - oder ich werde es sogar in meinem Kopf umkehren, um "Zeiger auf einen int" zu lesen, was ein wenig hilft.

Die Sache, die mir sehr hilft, ist, wann immer Sie * in Ihrem Code sehen - lesen Sie es als "worauf angezeigt wird".

Wenn Sie dieses Muster folgen, dann:

int num = *(int *)number; 

eine Integer-Variable „num“ den Wert zugewiesen wird: was Zeiger um einen int gezeigt wird, Nummer. Es übersetzt sich nur.

Manchmal muss man sich ein wenig mit der Formulierung herumärgern, aber seit ich diese Gewohnheit angenommen habe, hatte ich nie ein großes Problem, den Zeigercode zu lesen.

Ich glaube, ich lese auch & als "Die Adresse von" in C, aber ich denke, es wurde in C++ überlastet, wenn ich mich richtig erinnere.