2010-04-23 18 views
14

Gegeben ein Zeiger auf int, wie kann ich die tatsächliche int erhalten?Wie int * in int zu konvertieren

Ich weiß nicht, ob das möglich ist oder nicht, aber kann mir bitte jemand raten?

+3

Sie sagten, Sie sind nicht sicher, ob das möglich ist. Bedenken Sie: Wenn das nicht möglich wäre, was würde dann ein Zeiger verwenden? –

+1

krank zugeben, es war eine dämliche Frage – paultop6

Antwort

36

Verwenden Sie die * auf Zeiger verwenden die Variable spitz (dereferencing) zu erhalten.

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

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

Wenn Sie den Mauszeiger auf ein Array, dann sind Sie das erste Element des Arrays dereferencing geben.

Wenn Sie den „Wert“ des Zeigers wollen, dh die tatsächliche Speicheradresse der Zeiger enthält, warf sie dann (aber es ist im Allgemeinen keine gute Idee):

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

Sichereres Beispiel als jimkas – Toji

+0

Nicht sicher, ob static_cast für den letzten Satz richtig ist, geändert in neuinterpret_cast ... – Klaim

+1

Ist 'int' ein guter Typ, um einen Zeiger zu werfen? Wäre nicht "# " und "uintptr_t" tragbarer? – ndim

4

die Dereferenzierungsoperator * z

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

Dies beantwortet die Frage nicht. – Danvil

+3

Das int * j wurde in int k konvertiert. Das scheint die Frage zu beantworten. – CiscoIPPhone

1

Verwenden * zu dereferenzieren der Zeiger:

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

Dies beantwortet die Frage nicht. – Danvil

+0

Warum die d/v auf diese Antwort? –

+0

Ja, das verstehe ich auch nicht. – sharptooth

5

ich bin, wenn ich, was Sie wollen nicht 100% sicher verstehen:

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 Das hilft.

+0

+1 für die Erwähnung von Umwandlung in int – Vlad

+0

Dies ist C++, Sie sollten C-artige Umwandlungen vermeiden. –

+0

Warum? C-Style-Cast ist Teil der Sprache. Warum genau sollte man sie vermeiden? – rxantos

2

Sie sollten genau unterscheiden, was Sie wollen: Darsteller oder Dereferenzierung?

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. 

Sie können immer noch int direkt auf einen Zeiger zuweisen, dereferenzieren es einfach nicht, wenn Sie wirklich wissen, was Sie tun.

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 

Sie können ohne die explizite Casts tun (int), (int*), aber Sie werden höchstwahrscheinlich Compiler-Warnungen erhalten.

7

Wenn Sie den vom Zeiger angezeigten Wert abrufen müssen, ist das keine Konvertierung. Sie einfach den Zeiger dereferenzieren und ziehen Sie die Daten:

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

Aber wenn Sie wirklich den Zeiger auf einen int umwandeln müssen, dann müssen Sie werfen. Wenn Sie denken, dass Sie das wollen, denken Sie noch einmal darüber nach. Es ist wahrscheinlich nicht. Wenn Sie Code geschrieben haben, der dieses Konstrukt erfordert, müssen Sie über ein Redesign nachdenken, da dies offensichtlich unsicher ist. Trotzdem:

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

+1 für explizit erwähnen, dass keine Konvertierung stattfindet. –