在C++中是什么意思?整数 *p=(整数*)(&a+1)

问题描述 投票:0回答:2

在研究c++面试题的时候,卡在了下面的问题中:

下面代码的输出是什么?

int main()
{
  int a[5]={1,2,3,4,5};
  int  *p=(int*)(&a+1);

  cout<<*(a)<<endl;
  cout<<&a<<endl; 
  cout<<&a+1<<endl; 
  cout<<(*p)<<endl;
  cout<<(*p-1)<<endl;
  cout<<(*p-3)<<endl;
}

输出是

1
0x16fdff450
0x16fdff464
1
0
-2

我想知道为什么 *p 是 1,有人可以分享这个想法吗?

谢谢!

的解释

int  *p=(int*)(&a+1);
c++ pointers
2个回答
0
投票

程序具有 未定义的行为,因为您正在 类型转换 类型为

int(*)[5]
的指针到
int*
,然后取消引用该结果指针。基本上,您将结果指针视为指向一个整数。

未定义的行为意味着任何事情都可能发生(就 c++ 标准而言,允许发生)包括但不限于给出预期输出的程序。但永远不要依赖(或根据)具有 UB 的程序的输出。该程序可能会崩溃。


0
投票

int  *p=(int*)(&a+1);
是未定义的行为。这是因为
(&a + 1)
有效地将指针从 a 的地址移动了
sizeof(a)
(这就是 +1 的作用)。现在指针指向另一个与 a 大小相同但不是 a 的数组的开头,而不是我们实际上确定是新数组内存的内存位置。因此
cout << (*p)
输出1的原因一定是因为1恰好是数组a之后内存地址处的值。

© www.soinside.com 2019 - 2024. All rights reserved.