Как конвертировать int * в int - PullRequest
15 голосов
/ 23 апреля 2010

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

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

Ответы [ 6 ]

40 голосов
/ 23 апреля 2010

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

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

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

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

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

int pValValue = reinterpret_cast<int>( pVal );
8 голосов
/ 23 апреля 2010

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

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

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

int* p = get_int_ptr();
int val = reinterpret_cast<int>(p);
5 голосов
/ 23 апреля 2010

Я не уверен на 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

Надеюсь, это поможет.

4 голосов
/ 23 апреля 2010

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

void do_something(int *j) {
    int k = *j; //assign the value j is pointing to , to k
    ...
}
2 голосов
/ 23 апреля 2010

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

  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*), но, скорее всего, получите предупреждения компилятора.

1 голос
/ 23 апреля 2010

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...