2010-04-23 6 views
14

Étant donné un pointeur vers int, comment puis-je obtenir le int actuel?Comment convertir int * en int

Je ne sais pas si c'est possible ou non, mais quelqu'un peut-il me conseiller?

+3

Vous avez dit que vous n'êtes pas sûr que ce soit possible. Considérez: Si cela n'était pas possible, à quoi servirait un pointeur? –

+1

mal admettre que c'était une question stupide – paultop6

Répondre

36

Utilisez le * sur les pointeurs pour obtenir pointu (déréférencement) la variable. Si votre pointeur pointe vers un tableau, alors le déréférencement vous donnera le premier élément du tableau.

Si vous voulez que la « valeur » du pointeur, qui est l'adresse réelle de la mémoire le pointeur contient, puis jeté (mais il est généralement pas une bonne idée):

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

Exemple plus sûr que celui de jimka – Toji

+0

Vous ne savez pas si static_cast est correct pour la dernière phrase, changé pour reinterpret_cast ... – Klaim

+1

Est-ce que 'int' est un bon type pour lancer un pointeur? Est-ce que '#include ' et # uintptr_t' ne seraient pas plus portables? – ndim

4

utiliser l'opérateur de déréférencement * par exemple

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

+0

Cela ne répond pas à la question. – Danvil

+3

L'int * j a été converti en int k. Cela semble répondre à la question. – CiscoIPPhone

1

Utilisez * pour déréférencer la pointeur:

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

Cela ne répond pas à la question. – Danvil

+0

Pourquoi le d/v sur cette réponse? –

+0

Yeap, je ne comprends pas non plus. – sharptooth

5

Je ne suis pas sûr à 100% si je comprends ce que vous voulez:

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 Cela aide.

+0

+1 pour mentionner cast à int – Vlad

+0

Ceci est C++, vous devriez éviter les jets de style C. –

+0

Pourquoi? La distribution de style C fait partie de la langue. Pourquoi exactement devrait-on les éviter? – rxantos

2

Vous devez différencier strictement ce que vous voulez: lancer ou déréférencer?

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. 

Vous pouvez toujours attribuer int directement à un pointeur, il suffit de faire pas déréférencer à moins que vous vraiment savez ce que vous faites.

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 

Vous pouvez faire sans les moulages explicites (int), (int*), mais vous obtiendrez très probablement les avertissements du compilateur.

7

Si vous avez besoin de la valeur pointée par le pointeur, alors ce n'est pas une conversion. Il vous suffit de déréférencer le pointeur et tirez sur les données:

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

Mais si vous vraiment besoin de convertir le pointeur vers un entier, alors vous devez jeter. Si vous pensez que c'est ce que vous voulez, détrompez-vous. Ce n'est probablement pas. Si vous avez écrit du code qui nécessite cette construction, vous devez penser à une nouvelle conception, car cela est manifestement dangereux. Néanmoins:

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

+1 pour explicitement mentionner aucune conversion qui se passe. –