试图理解:二进制表达式的无效操作数,C

时间:2015-10-04 21:34:50

标签: c

最后一行产生“二进制表达式的无效操作数”。试图理解为什么。这是否意味着“p2-p1”是位于p3右侧的二进制表达式“ - ”的无效操作数?我可以遵循的任何规则吗?让我感到困惑,因为“3-2-1”整数是有效的。

  int array[3] = {1,2,3};
  int* p1 = &array[0];
  int* p2 = &array[1];
  int* p3 = &array[2];

  p3-p2-p1;

2 个答案:

答案 0 :(得分:3)

你正在做地址算术。给定运算符优先级,它将p1-p2-p3评估为(p1-p2)-p3p1-p2不是地址而是整数。然后,您尝试从整数中减去一个地址,该地址无效。你可以做p1-(p2-p3),然后它取p2-p3,产生一个整数,并将其作为一个整数偏移量减去地址(p1),这将被编译。但是,[感谢@EOF在他的评论中提供了这个参考]这样的减法(来自指针的整数)只有在它指向p1的分配范围内时才有效。它符合第6.5.6节中具体描述的C11标准,摘录如下:

  

添加或减去具有整数类型的表达式时   从指针开始,结果具有指针操作数的类型。如果   指针操作数指向数组对象的元素和数组   足够大,结果指向一个偏离的元素   原始元素使得下标的差异   结果和原始数组元素等于整数表达式。   换句话说,如果表达式P指向一个的第i个元素   数组对象,表达式(P)+ N(等效地,N +(P))和(P)-N   (其中N具有值n)分别指向第i + n和第i   数组对象的第i个元素,只要它们存在即可。而且,如果   表达式P指向数组对象的最后一个元素,即   表达式(P)+1指向数组对象的最后一个元素,   如果表达式Q指向一个数组的最后一个元素   对象,表达式(Q)-1指向数组的最后一个元素   宾语。如果指针操作数和结果都指向元素   相同的数组对象,或一个超过数组的最后一个元素   对象,评估不得产生溢出;否则,   行为未定义。如果结果指向最后一个元素   对于数组对象,它不应该用作一元*的操作数   被评估的运算符。

答案 1 :(得分:2)

在您的代码中,p1p2p3都是指向整数的指针,而不是整数。

为了得到你想要的东西,你可能想要:

*p3 - *p2 - *p1;

*运算符是dereference operator。它取消引用指针,因此在这种情况下*p3等类型为int。您可以将其视为&地址运算符的反转。