我想将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
答案 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;
即。您要取消引用NumRecPrinted
,int
会将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;
}