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;
}
因此上面的代码会崩溃,如果崩溃是我们为什么允许甚至为指针添加常量的原因。
答案 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)
向指针添加常量非常有用,例如遍历元素在内存中连续的数据结构。
但是,更难找到添加两个指针的用例,因为这会产生一个基本上不相关的地址,正如你所说,这可能是非法的。