为什么我们不能添加两个指针?

时间:2016-02-15 05:30:47

标签: c++ pointers

int main()
{
  int x=10;
  cout<<"value of x: "<<x<<endl;
  cout<<"address of x: "<<&x<<endl;

  int *p;
  p=&x;
  cout<<"value of p: "<<p<<endl;
  cout<<"address of p: "<<&p<<endl;
  cout<<"pointer of p: "<<*p<<endl;

  cout<<"\n"<<"ADDING"<<"\n\n";
  p=p+2;
  cout<<"value of p: "<<p<<endl;
  cout<<"address of p: "<<&p<<endl;
  cout<<"pointer of p: "<<*p<<endl;

  return 0;
}

在上面的代码中,我在指针 p 中添加一个常数,但是如果我尝试添加2个指针,那么我会收到一个不允许的错误。

我理解不添加2个指针的原因是它可能导致溢出并导致代码崩溃。

但是,如果我想崩溃代码,那么我可以在指针中添加一个更大的数字,如下所示:

int main()
{
  int x=10;
  cout<<"value of x: "<<x<<endl;
  cout<<"address of x: "<<&x<<endl;

  int *p;
  p=&x;
  cout<<"value of p: "<<p<<endl;
  cout<<"address of p: "<<&p<<endl;
  cout<<"pointer of p: "<<*p<<endl;

  cout<<"\n"<<"ADDING"<<"\n\n";
  p=p+10000000000000000;
  cout<<"value of p: "<<p<<endl;
  cout<<"address of p: "<<&p<<endl;
  cout<<"pointer of p: "<<*p<<endl;

  return 0;
}

因此上面的代码会崩溃,如果崩溃是我们为什么允许甚至为指针添加常量的原因。

4 个答案:

答案 0 :(得分:2)

我理解不添加2个指针的原因是它可能导致溢出并导致代码崩溃。

这不是唯一的原因。主要原因是它在指针视角中没有任何意义。

在向2添加p等常数时,请考虑一下。这意味着你希望p跳过元素并开始指向线性内存块中的第二个元素。

但是因为添加2个指针毫无意义,所以根本没用。

引用K&amp; R,

  

有效指针操作是指定相同类型的指针,添加和减去指针和整数,减去或比较指向同一数组成员的两个指针,以及分配或比较为零。所有其他指针算法都是非法的。 添加两个指针是不合法的......

答案 1 :(得分:1)

  

我理解不添加2个指针的原因是它可能导致溢出并导致代码崩溃。

这是不正确的。

二进制+操作及其含义由指针和整数类型的标准定义。

标准根本没有定义两个指针之间的二进制+操作。

这不是讨论标准为何没有定义该操作的正确位置。

答案 2 :(得分:0)

你没有添加两个指针。 p保存x的地址。所以一旦你添加P + 2,那么指针指向+2地址位置 例如,如果你的x位于0x1000地址位置,那么在添加之后,你的指针将指向(0x1000 +(2 * sizeof(int)))地址位置

答案 3 :(得分:0)

向指针添加常量非常有用,例如遍历元素在内存中连续的数据结构。

但是,更难找到添加两个指针的用例,因为这会产生一个基本上不相关的地址,正如你所说,这可能是非法的。