Учитывая указатель на int
, как я могу получить фактический int
?Как преобразовать int * в int
Я не знаю, возможно ли это или нет, но может кто-нибудь мне посоветуете?
Учитывая указатель на int
, как я могу получить фактический int
?Как преобразовать int * в int
Я не знаю, возможно ли это или нет, но может кто-нибудь мне посоветуете?
Используйте * на указатели, чтобы получить переменную указал (разыменования).
int val = 42;
int* pVal = &val;
int k = *pVal; // k == 42
Если ваш указатель указывает на массив, то разыменование даст вам первый элемент массива.
Если вы хотите «значение» указателя, то есть фактический адрес памяти указатель содержит, а затем бросить его (но это не очень хорошая идея):
int pValValue = reinterpret_cast<int>(pVal);
использовать разыменовывания оператор *
например
void do_something(int *j) {
int k = *j; //assign the value j is pointing to , to k
...
}
Это не отвечает на вопрос. – Danvil
int * j был преобразован в int k. Это похоже на вопрос. – CiscoIPPhone
Используйте * для разыменовать указатель:
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
Это не отвечает на вопрос. – Danvil
Почему d/v на этот ответ? –
Yeap, я тоже этого не понимаю. – sharptooth
Я не 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 Это помогает.
Вы должны четко различать то, что хотите: литье или разыменование?
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*)
, но вы, скорее всего, получите предупреждения компилятора.
Если вам нужно получить значение, указанное указателем, то это не преобразование. Вы просто разыменования указателя и вытаскивать данные:
int* p = get_int_ptr();
int val = *p;
Но если вы действительно нужно преобразовать указатель на междунар, то вам нужно бросить. Если вы думаете, что это то, что вы хотите, подумайте еще раз. Наверное, нет. Если вы написали код, требующий этой конструкции, вам нужно подумать о редизайне, потому что это явно небезопасно. Тем не менее:
int* p = get_int_ptr();
int val = reinterpret_cast<int>(p);
+1 для явно упоминания о том, что конверсия не происходит. –
Вы сказали, что не уверены, возможно ли это. Подумайте: если это было невозможно, каково было бы использование указателя? –
плохо признаю, что это был глупый вопрос – paultop6