2010-04-23 53 views
14

Dado un puntero a int, ¿cómo puedo obtener el int real?Cómo convertir int * a int

No sé si esto es posible o no, pero alguien puede por favor asesorarme?

+3

Dijiste que no estás seguro si eso es posible. Considere: si eso no fuera posible, ¿cuál sería el uso de un puntero? –

+1

admitir que fue una pregunta tonta – paultop6

Respuesta

36

Uso del * sobre los punteros para obtener la variable señalado (eliminación de referencias).

int val = 42; 
int* pVal = &val; 

int k = *pVal; // k == 42 

Si su puntero apunta a una matriz, desreferenciando le dará el primer elemento de la matriz.

Si desea que el "valor" del puntero, que es la dirección de memoria real del puntero contiene, entonces echó (pero no es generalmente una buena idea):

int pValValue = reinterpret_cast<int>(pVal); 
+0

Ejemplo más seguro que jimka – Toji

+0

No estoy seguro si static_cast es correcto para la última oración, cambiado a reinterpret_cast ... – Klaim

+1

¿Es 'int' un buen tipo para lanzar un puntero? ¿No sería '#include ' y 'uintptr_t' más portátil? – ndim

4

uso, el usuario desreferenciar * por ejemplo

void do_something(int *j) { 
    int k = *j; //assign the value j is pointing to , to k 
    ... 
} 
+0

Esto no responde la pregunta. – Danvil

+3

El int * j se ha convertido a int k. Eso parece responder la pregunta. – CiscoIPPhone

1

Usar para eliminar la referencia al puntero:

int* pointer = ...//initialize the pointer with a valid address 
int value = *pointer; //either read the value at that address 
*pointer = value;//or write the new value 
+0

Esto no responde la pregunta. – Danvil

+0

¿Por qué el d/v en esta respuesta? –

+0

Yeap, tampoco entiendo eso. – sharptooth

5

no estoy 100% seguro si entiendo lo que quiere:

int a=5;   // a holds 5 
int* ptr_a = &a; // pointing to variable a (that is holding 5) 
int b = *ptr_a; // means: declare an int b and set b's 
       // value to the value that is held by the cell ptr_a points to 
int ptr_v = (int)ptr_a; // means: take the contents of ptr_a (i.e. an adress) and 
         // interpret it as an integer 

Hop e esto ayuda.

+0

+1 por mencionar el lanzamiento a int – Vlad

+0

Esto es C++, debes evitar los moldes de estilo C. –

+0

¿Por qué? El elenco de estilo C es parte del lenguaje. ¿Por qué exactamente debería uno evitarlos? – rxantos

2

Debe diferenciar estrictamente lo que desea: ¿lanzamiento o desreferencia?

int x = 5; 
    int* p = &x; // pointer points to a location. 
    int a = *p;  // dereference, a == 5 
    int b = (int)p; //cast, b == ...some big number, which is the memory location where x is stored. 

Todavía se puede asignar int directamente a un puntero, simplemente no eliminar la referencia a menos que realmente sabe lo que está haciendo.

int* p = (int*) 5; 
    int a = *p;  // crash/segfault, you are not authorized to read that mem location. 
    int b = (int)p; // now b==5 

se puede hacer sin las conversiones explícitas (int), (int*), pero lo más probable es obtener las advertencias del compilador.

7

Si necesita que el puntero señale el valor, entonces eso no es una conversión. Sólo tiene que eliminar la referencia al puntero y saca los datos:

int* p = get_int_ptr(); 
int val = *p; 

Pero si realmente necesita para convertir el puntero a un int, entonces usted necesita para echar. Si crees que esto es lo que quieres, piénsalo de nuevo. Probablemente no. Si escribió el código que requiere este constructo, entonces debe pensar en un rediseño, porque esto es claramente inseguro. Sin embargo:

int* p = get_int_ptr(); 
int val = reinterpret_cast<int>(p); 
+0

+1 por mencionar explícitamente que no está ocurriendo ninguna conversión. –