将int转换为指针

时间:2012-02-09 14:01:18

标签: c++ pointers

我想将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 个答案:

答案 0 :(得分:6)

将非指针值“编码”到指针中有时很有用,例如当您需要将数据传递到 pthreads 线程参数(void*)时。

在C ++中,你可以通过hackery来做到这一点; C风格的演员表是这个hackery的一个例子,事实上your program works as desired

#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转换为指针,因为在一般中没有任何意义。实际上,即使在 pthreads 情况下,将指针传递给封装您想要传递的数据的某个结构也更合乎逻辑。

所以,基本上......“不要”。

答案 1 :(得分:3)

你想这样做:

NumRecPrinted = &no_of_records;

即。您使用no_of_records的地址并将其分配给NumRecPrinted

然后打印出来:

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

即。您要取消引用NumRecPrintedint会将NumRecPrinted存储在{{1}}指向的内存地址。

答案 2 :(得分:2)

#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;
}

答案 3 :(得分:1)

(int *)no_of_records为您提供指向地址no_of_records的指针。要获取指向no_of_records值的指针,您需要编写&no_of_records

答案 4 :(得分:0)

以下是更正后的版本:

#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;
}

请注意添加的&符号和星号。

答案 5 :(得分:0)

我真的很喜欢使用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;
}