2010-04-23 2 views
14

Учитывая указатель на int, как я могу получить фактический int?Как преобразовать int * в int

Я не знаю, возможно ли это или нет, но может кто-нибудь мне посоветуете?

+3

Вы сказали, что не уверены, возможно ли это. Подумайте: если это было невозможно, каково было бы использование указателя? –

+1

плохо признаю, что это был глупый вопрос – paultop6

ответ

36

Используйте * на указатели, чтобы получить переменную указал (разыменования).

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

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

Если ваш указатель указывает на массив, то разыменование даст вам первый элемент массива.

Если вы хотите «значение» указателя, то есть фактический адрес памяти указатель содержит, а затем бросить его (но это не очень хорошая идея):

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

Более безопасный пример, чем jimka's – Toji

+0

Не уверен, что static_cast подходит для последнего предложения, изменено на reinterpret_cast ... – Klaim

+1

Является ли 'int' хорошим типом для указания указателя? Не будет '#include ' и 'uintptr_t' быть более портативным? – ndim

4

использовать разыменовывания оператор * например

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

Это не отвечает на вопрос. – Danvil

+3

int * j был преобразован в int k. Это похоже на вопрос. – CiscoIPPhone

1

Используйте * для разыменовать указатель:

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

Это не отвечает на вопрос. – Danvil

+0

Почему d/v на этот ответ? –

+0

Yeap, я тоже этого не понимаю. – sharptooth

5

Я не 100% уверен, что, если я понимаю, что вы хотите:

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 Это помогает.

+0

+1 для упоминания приведения в int – Vlad

+0

Это C++, вам следует избегать приведения в стиле C. –

+0

Почему? Приведение стиля C является частью языка. Почему именно следует избегать их? – rxantos

2

Вы должны четко различать то, что хотите: литье или разыменование?

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. 

Вы все еще можете назначить Int непосредственно к указателю, просто не разыменования это, если вы действительно не знаете, что вы делаете.

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 

Вы можете обойтись без явных слепков (int), (int*), но вы, скорее всего, получите предупреждения компилятора.

7

Если вам нужно получить значение, указанное указателем, то это не преобразование. Вы просто разыменования указателя и вытаскивать данные:

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

Но если вы действительно нужно преобразовать указатель на междунар, то вам нужно бросить. Если вы думаете, что это то, что вы хотите, подумайте еще раз. Наверное, нет. Если вы написали код, требующий этой конструкции, вам нужно подумать о редизайне, потому что это явно небезопасно. Тем не менее:

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

+1 для явно упоминания о том, что конверсия не происходит. –