преобразование int в указатель - PullRequest
4 голосов
/ 09 февраля 2012

Я хочу сохранить значение int в переменной указателя.Но я получаю сообщение об ошибке:

#include <iostream>
using namespace std;

int main()
{
  int *NumRecPrinted = NULL;
  int no_of_records = 10;
  NumRecPrinted = (int*)no_of_records; // <<< Doesn't give value of NumRecPrinted

  cout << "NumRecPrinted!" << NumRecPrinted;
  return 0;
}

Я пытался сделать это, но я получаю 0 в качестве возврата:

int main()
{
    int demo(int *NumRecPrinted);
    int num = 2;
    demo(&num);
    cout << "NumRecPrinted=" << num;    <<<< Prints 0
    return 0;
}

int demo (int *NumRecPrinted)

{
    int no_of_records = 11;
    NumRecPrinted = &no_of_records;
}

NumRecPrinted возвращает как 0

Ответы [ 6 ]

6 голосов
/ 09 февраля 2012

Иногда полезно «кодировать» не указатель значения в указатель, например, когда вам нужно передать данные в pthreads аргумент потока (void*).

В C ++ вы можете сделать это, взломав;Приведения в стиле C являются примером этой хакерской атаки, и на самом деле ваша программа работает как нужно :

#include <iostream>
using namespace std;

int main()
{
  int *NumRecPrinted = NULL;
  int no_of_records = 10;
  NumRecPrinted = (int*)no_of_records;

  cout << "NumRecPrinted!" << NumRecPrinted; // Output: 0xa (same as 10)
  return 0;
}

Вам просто нужно понять, что 0xa является шестнадцатеричным представлениемдесятичный 10.

Однако, этот является взломом;вы не должны быть в состоянии конвертировать int s в указатели, потому что в general это не имеет смысла.На самом деле, даже в случае pthreads гораздо логичнее передать указатель на некоторую структуру, которая инкапсулирует данные, которые вы хотите передать.

Итак, в основном ... "don"т».

3 голосов
/ 09 февраля 2012

Вы хотите сделать это:

NumRecPrinted = &no_of_records;

т.е. вы берете адрес no_of_records и присваиваете ему NumRecPrinted.

А затем распечатать его:

cout << "NumRecPrinted!" << *NumRecPrinted;

т.е.. вы разыменовываете NumRecPrinted, в результате чего int сохраняется по адресу памяти, указанному NumRecPrinted.

2 голосов
/ 09 февраля 2012
#include <iostream>
using namespace std;

int main()
{
int *NumRecPrinted = NULL; // assign pointer NumRecPrinted to be valued as NULL
int *NumRecPrinted2 = NULL;
int no_of_records = 10; // initialize the value of the identificator no_of_records 
NumRecPrinted = (int*)no_of_records; // sets a pointer to the address no_of_records
NumRecPrinted2 = &no_of_records; // gives a pointer to the value of no_of_records

cout << "NumRecPrinted!" << NumRecPrinted;  // address of no_of_records 0000000A
cout << "NumRecPrinted!" << *NumRecPrinted2; // value of no_of_records 10
system("pause"); // ninja 
return 0;
}
1 голос
/ 09 февраля 2012

(int *)no_of_records дает вам указатель на адрес no_of_records. Чтобы получить указатель на значение no_of_records, необходимо написать &no_of_records.

0 голосов
/ 09 февраля 2012

Мне действительно нравится использовать union для такого рода вещей:

#include <iostream>
using namespace std;

int main()
{
  static_assert(sizeof(int) == sizeof(int*));

  union { int i; int* p; } u { 10 };

  cout << "NumRecPrinted! " << u.p;
  return 0;
}
0 голосов
/ 09 февраля 2012

Вот исправленная версия:

#include <iostream>
using namespace std;
int main()
{
  int *NumRecPrinted = NULL;
  int no_of_records = 10;
  NumRecPrinted = &no_of_records; // take the address of no_of_records

  cout << "NumRecPrinted!" << *NumRecPrinted; // dereference the pointer
  return 0;
}

Обратите внимание на добавленный амперсанд и звездочку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...