2010-04-23 2 views
14

Dato un puntatore a int, come è possibile ottenere l'attuale int?Come convertire int * in int

Non so se è possibile o no, ma qualcuno può consigliarmi?

+3

Hai detto che non sei sicuro se è possibile. Considera: se ciò non fosse possibile, quale sarebbe l'uso di un puntatore? –

+1

ammettere che era una domanda stupida – paultop6

risposta

36

Utilizzare il * su puntatori per ottenere variabile puntata (dereferenziazione).

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

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

Se il puntatore punta a un array, il dereferenziamento fornisce il primo elemento dell'array.

Se si desidera che il "valore" del puntatore, che è l'indirizzo di memoria effettivo il puntatore contiene, poi gettato esso (ma non è generalmente una buona idea):

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

Esempio più sicuro di jimka's – Toji

+0

Non sono sicuro se static_cast sia corretto per l'ultima frase, modificato in reinterpret_cast ... – Klaim

+1

È "int" un buon tipo per il cast di un puntatore? '#include ' e 'uintptr_t' sono più portatili? – ndim

4

utilizzare l'operatore dereference * es

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

Questo non risponde alla domanda. – Danvil

+3

L'int * j è stato convertito in int k. Questo sembra rispondere alla domanda. – CiscoIPPhone

1

Usa * a dereference il puntatore:

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

Questo non risponde alla domanda. – Danvil

+0

Perché il d/v su questa risposta? –

+0

Yeap, non capisco neanche questo. – sharptooth

5

io non sono sicuro al 100% se ho capito quello che vuoi:

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 questo aiuta.

+0

+1 per aver menzionato il cast in int – Vlad

+0

Questo è C++, dovresti evitare i cast in stile C. –

+0

Perché? Il cast di stile C fa parte della lingua. Perché esattamente dovremmo evitarli? – rxantos

2

È necessario differenziare rigorosamente ciò che si desidera: cast o dereferenziazione?

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. 

È ancora possibile assegnare int direttamente a un puntatore, basta non dereferenziarlo meno che non si davvero sai quello che stai facendo.

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 

si può fare senza i cast espliciti (int), (int*), ma è molto probabile ottenere avvisi del compilatore.

7

Se è necessario ottenere il valore puntato dal puntatore, non si tratta di conversione. È sufficiente dereference il puntatore e tira fuori i dati:

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

Ma se si realmente necessario convertire il puntatore a un int, allora avete bisogno di lanciare. Se pensi che questo sia ciò che vuoi, ripensaci. Probabilmente no. Se hai scritto un codice che richiede questo costrutto, allora devi pensare a una riprogettazione, perché questo è chiaramente non sicuro. Tuttavia:

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

+1 per menzionare esplicitamente che non si sta verificando alcuna conversione. –