C++ 将ptr显式转换为;ptr转为ptr“;

C++ 将ptr显式转换为;ptr转为ptr“;,c++,pointers,casting,C++,Pointers,Casting,我在一次采访中遇到了这个代码 int main() { int **p; p = (int **) new int(7); cout<<*p; return 0; } intmain() { int**p; p=(int**)新int(7); 您可以创建一个新的int并用值7初始化它 int *x = new int(7); new int(7); 然后将其强制转换为指针(例如内存地址7或0x07) 然后用cout显示这个地址 *p is eq

我在一次采访中遇到了这个代码

int main()
{
    int **p;
    p = (int **) new int(7);
    cout<<*p; 
    return 0;
}
intmain()
{
int**p;
p=(int**)新int(7);

您可以创建一个新的int并用值7初始化它

int *x = new int(7);
new int(7);
然后将其强制转换为指针(例如内存地址7或0x07)

然后用cout显示这个地址

*p is equal to (int*)7
它是一个值为7的指针

int *x = new int(7);
new int(7);
为值为
7
int
分配内存并返回指向它的指针

int **p = (int **) new int(7);
告诉编译器将该内存解释为
int**

cout << *p;
cout
int main()
{
int**p;//声明指向名为p的指针的指针
p=(int**)new int(7);//new分配初始化为值7的整数并返回一个指针。将指针强制转换为指向指针的点。p现在表示指向内容为0x7的指针的指针。如果调用**p,将获得地址0x7处的内容。

cout除非给你一些额外的限制,否则正确的答案是上述任何一项都不会。基本上,代码是分配一个
int
,并将该内存解释为
int*
(通过
重新解释
)。第一个问题是,作为一个
重新解释
,结果在一般情况下是未指定的,并且如果
int
的大小小于
int*
的大小(考虑64位体系结构)结果是未定义的行为,因为您读取的内容超出了
new
调用中分配的大小。

int main()
int main()
{
    int **p = (int **) new int(7);
    cout << *p;
}
{ int**p=(int**)新int(7);
你想做什么?一个基本的经验法则是,如果你必须施放,你就做错了。因为
newint(7)
返回
int*
,你需要施法。但是施法并不能使代码正确。它只是证明你错了。移除施法,然后从那里开始工作。@David:代码可能来自面试,而不是OP。@David Heffernan:这是笔试中的面试问题。编译时错误有四个选项r、 运行时错误,代码将正常运行,以上都没有。即使我也不明白他们试图通过这些访谈问题来衡量什么样的知识。是的,因此正确答案应该是“依赖于实现”。例如,在指针大小与int不同的平台上,这将失败得可怕。@Lister先生:很可能,即使sizeof(int)!=sizeof(pointer),这也不会失败。它只会覆盖一些内存,但很有可能不会使程序崩溃。代码本身已经是未定义的行为…不需要执行额外的取消引用。@Luchian Grigore:谢谢,这很有帮助。这似乎表明代码是正确的,或者至少在任何情况下都会产生相同的输出,而le它不会。取消对
p
的引用会导致未定义的行为。当您将int(32位)强制转换为int*(64位)时结果被扩展到64位。@gulyan,但在这种情况下,编译器不知道它应该执行这种类型的转换。唯一执行的转换是从int*到int**,在上面的一行中!@gulyan:不,在从32位整数到64位整数的
静态转换中,编译器将执行扩展大小的转换,但在
reinterpret\u cast
在这种情况下,它只需添加代码来重新解释内存。也就是说,它将获取指向
int
的指针并读取接下来的64位(8字节)好像它是一个<代码> int */CODE >,这是未定义的行为。这是C样式转换的最大问题之一,它不像显式C++的显示一样清晰。