#include<iostream>
using namespace std;
int main()
{
int *p,*c;
p=(int*)10;
c=(int*)20;
cout<<(int)p<<(int)c;
}
有人问我“上面代码出了什么问题?”我无法理解。有人请帮助我。
答案 0 :(得分:9)
根据C ++标准,int
和指针数据类型不需要具有相同的位数这一事实是一回事 - 这意味着您可能会失去精度。
此外,将int
转换为int
指针然后再回来是愚蠢的。为什么不把它留作int
?
我实际上做了尝试在gcc下编译它并且它工作正常但是这可能比偶然而不是好的设计。
答案 1 :(得分:8)
有些人想要一个C ++标准的引用(如果评论的格式不受限制,我会把它放在那个答案的评论中),这里有两个来自1999年的一个:
5.2.10 / 3
reinterpret_cast
执行的映射是实现定义的。
5.2.10 / 5
可以将整数类型或枚举类型的值显式转换为指针。 指针转换为足够大小的整数(如果实现中存在ant) 并返回相同的指针类型将具有其原始值;指针和指针之间的映射 整数是以实现方式定义的。
我没有看到强制要求这种实现定义的映射必须为所有输入提供有效的表示。否则说,在执行
时,具有地址寄存器的架构上的实现可以很好地捕获p = (int*)10;
如果映射没有给出当时有效的表示(是的,指针的有效表示可能取决于时间。例如,delete
可能使删除指针的表示无效)。 / p>
答案 2 :(得分:1)
假设我认为这应该是正确的,它应该是这样的:
int main()
{
int *p, *c;
// Something that creates whatever p and c point to goes here, a trivial example would be.
int pValue, cValue;
p = &pValue;
c = &cValue;
// The & operator retrieves the memory address of pValue and cValue.
*p = 10;
*c = 20;
cout << *p << *c;
}
为了为指针引用的变量赋值或检索值,需要dereference它。
你的代码正在做的是将10转换为指向int的指针(这是实际int所在的内存地址)。
答案 3 :(得分:0)
您正在为指针分配值(10和20),如果您尝试读取这些地址的数据,这显然是一个潜在的问题。将指针强制转换为整数也非常难看。并且您的main函数没有return语句。这只是一些事情。
答案 4 :(得分:0)
地址p和c可能大于int。
答案 5 :(得分:0)
您需要的某些平台上的问题
p = (int*) (long) 10;
请参阅type conversion macros上的GLIB文档。
对于那些可能无法使用此类表达式的人,可以在指针值返回函数内返回数据。你可以找到现实世界的例子,在这种情况下,最好使用这个习惯用法,而不是在堆上分配一个新的整数,并将其返回 - 性能不佳,内存碎片,只是丑陋。
答案 6 :(得分:-1)
或多或少都有问题:
int *p,*c;
p=(int*)10;
c=(int*)20;
这看起来并不是故意的。
我认为整个程序都会崩溃。