2010-11-13 22 views
11

que estaba viendo algo de código C++, y vi esto:int num = * (int *) número; ¿Qué hace esto?

int num = *(int *)number; 

que nunca había visto esto antes? fue en una función etiquetada como tal:

void *customer(void *number){ } 

¿Qué que incluso lo hacen? ¿Hay alguna manera diferente de mostrar esto?

Gracias, esto no es tarea por cierto, estaba confundido por lo que hace esto?

Respuesta

11

La parte (int *) arroja el número variable a un puntero a un int, luego el * en frente lo desreferencia a un int.

+0

+1 @Charles sí, básicamente num ahora tendrá una copia del valor al que apuntaba el número. – pstrjds

+0

Merece la pena agregarlo: Al convertir FROM void pointer, tenemos que usar los operadores de conversión. Esta es la razón de usar (int *) que arroja 'number' que es puntero a void, a un puntero a un int. Y * además deferencia este puntero a un int para devolver un int. –

10

La función toma un void*, pero de alguna manera sabe (tal vez se requiere en alguna documentación en alguna parte) que el puntero que se le da en realidad apunta a un int.

Así, (int*)number es "el puntero original, convertida en una int* para que pueda leer un int de ella", y *(int*)number es el valor int que apunte a.

1

La función acepta un puntero de vacío (anulado *). Para desreferenciarlo a una variable de un cierto tipo (por ejemplo, int), que es lo que hace el primer "*", debe convertirlo en un puntero a un tipo real, en este caso a un puntero int a través de (int) *) Reparto

1

Asumo customer se utiliza como esto:

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

en este caso, el código de cliente es el encasillamiento void * a un int * y luego derreferenciándolo (obtener su valor). Primero debe encasillarse porque void * significa básicamente "apunta a algo", lo que le permite pasar cualquier tipo que desee. Sin el tipo de difusión, el compilador no sabe si quiere leer un char (generalmente 1 byte), un short (generalmente 2 bytes) o un int (generalmente 4 bytes). El tipocast elimina la ambigüedad.

Nota usando void * para el argumento probablemente no es la mejor, ya que podría hacer: (! Un double no es una int)

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

y esto va a compilar, pero no se verá hasta al cliente 69 .

El uso de void * puede ser intencional, el código puede determinar (con suerte) entre punteros y un argumento como: (void *)3 - que sería un caso especial.

1

Las respuestas correctas ya están aquí, pero ¿puedo contarle un truco que generalmente me ayudó cuando tuve que usar mucho C?

Así se pronuncia "*" en la cabeza, y hay dos partes.

La parte común es cuando es parte de un tipo - y todo el mundo probablemente dice "puntero" cuando lo leen, lo cual es genial. Así que (int *) es un puntero int - o incluso lo revertiré en mi cabeza para leer "puntero a un int" que parece ayudar un poco.

Lo que más ayuda para mí es cuando ves * en tu código, léelo como "a lo que apunta".

Si usted sigue este patrón, entonces:

int num = *(int *)number; 

es una variable "num" entero se le asigna el valor: lo que está apuntada por un puntero int, número. Simplemente se traduce a sí mismo.

A veces hay que confundirse un poco con el fraseo, pero desde que tuve ese hábito nunca tuve un gran problema al leer el código del puntero.

Creo que también leí & como "La dirección de" en C, pero creo que se ha sobrecargado en C++ si no recuerdo mal.