2010-11-13 5 views
11

Je cherchais à un code C++, et j'ai vu ceci:int num = * (int *) nombre; Qu'est-ce que ça fait?

int num = *(int *)number; 

Je ne l'avais jamais vu cela auparavant? il était en fonction étiquetés comme tels:

void *customer(void *number){ } 

Qu'est-ce que ça fait? Existe-t-il une façon différente de montrer cela?

Merci, ce n'est pas devoirs btw je étais juste confus à ce que cela fait?

Répondre

11

La partie (int *) convertit le nombre variable en un pointeur vers un int, puis le * à l'avant le déréférence à un int.

+0

+1 @Charles Oui, en gros num va maintenant contenir une copie de la valeur vers laquelle pointe le numéro. – pstrjds

+0

Il vaut la peine d'ajouter: Lors de la sortie du pointeur vide, nous devons utiliser les opérateurs cast. C'est la raison pour laquelle on utilise (int *) qui renvoie 'number' pointeur vers void, pointeur vers int. Et * déférence plus loin ce pointeur vers un int pour retourner un int. –

10

La fonction prend un void*, mais d'une manière ou d'une autre il sait (peut-être qu'il est nécessaire dans une documentation quelque part) que le pointeur qu'il pointe pointe vers un int.

Ainsi, (int*)number est « le pointeur d'origine, converti en un int* pour que je puisse lire un int de celui-ci », et *(int*)number est la valeur int qu'il pointe.

1

La fonction accepte un pointeur vide (donc void *). Pour le déréférencer vers une variable d'un certain type (par exemple int) - ce que fait le premier "*" - vous devez le convertir en un pointeur vers un type réel - dans ce cas un pointeur int via (int *) Caste

1

Je suppose customer est utilisé comme ceci:

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

dans ce cas, le code client est le transtypage void * à un int * et déréférencement il (obtenir sa valeur). Il doit d'abord être catalogué car void * signifie fondamentalement "pointeur vers quelque chose", ce qui vous permet de passer le type que vous voulez. Sans le typecast, le compilateur ne sait pas si vous voulez lire un char (généralement 1 octet), un short (généralement 2 octets) ou un int (généralement 4 octets). Le typecast supprime l'ambiguïté.

note à l'aide void * pour l'argument est sans doute pas le meilleur, puisque vous pouvez faire: (! Un double est pas un int)

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

Et cela va compiler, mais ne sera pas rechercher client 69 .

L'utilisation de void * peut être intentionnelle, le code peut être en mesure de déterminer (espérons-le en toute sécurité) entre les pointeurs et un argument comme: (void *)3 - ce qui serait un cas particulier.

1

Les réponses correctes sont déjà là, mais puis-je vous dire une astuce qui m'a généralement aidé quand je devais beaucoup utiliser C?

C'est comme ça que vous prononcez «*» dans votre tête - et il y a deux parties.

La partie commune est quand il fait partie d'un type - et tout le monde dit probablement "pointeur" quand ils le lisent, ce qui est génial. So (int *) est un pointeur int - ou je vais même inverser dans ma tête pour lire "pointeur vers un int" qui semble aider un peu.La chose qui m'aide beaucoup, c'est quand vous voyez * dans votre code - lisez-la comme "ce qui est pointé par".

Si vous suivez ce modèle, puis:

int num = *(int *)number; 

est une variable entier « num » obtient attribué la valeur: ce qui est pointé par un pointeur int, nombre. Cela se traduit simplement.

Parfois, vous devez jouer avec le phrasé un peu, mais depuis que je suis dans cette habitude, je n'ai jamais eu un gros problème de lecture du code du pointeur.

Je crois que j'ai lu aussi & comme "L'adresse de" en C, mais je pense qu'il a été surchargé en C++ si je me souviens bien.

Questions connexes