最后一行产生“二进制表达式的无效操作数”。试图理解为什么。这是否意味着“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;
答案 0 :(得分:3)
你正在做地址算术。给定运算符优先级,它将p1-p2-p3
评估为(p1-p2)-p3
。 p1-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)
在您的代码中,p1
,p2
和p3
都是指向整数的指针,而不是整数。
为了得到你想要的东西,你可能想要:
*p3 - *p2 - *p1;
*
运算符是dereference operator。它取消引用指针,因此在这种情况下*p3
等类型为int
。您可以将其视为&
地址运算符的反转。