C代码运行报invalid operands to binary - (have 'int *' and 'int **')错误如何解决
C语言指针运算报错原因及修复方案
错误产生原因
C语言中指针减法运算有严格的类型要求:只有两个基类型完全相同、且指向同一个数组元素的指针,才能直接做减法,得到的结果是两个指针之间的元素个数差。
你报错的*pp-p表达式存在类型不匹配问题:
p是存储int*类型元素的数组名,参与运算时会自动退化为int**类型的指针,指向p数组的首元素*pp是对二级指针pp解引用后的结果,类型为int*
两个操作数基类型分别为int*和int**,不符合指针减法的类型要求,因此编译器抛出invalid operands to binary -错误。
修复方法
结合你上一行打印语句的逻辑,你应该是要计算*pp指向的地址和a数组首地址的偏移、以及对应地址存储的数值,只需要将报错行的两处*pp-p分别修改为*pp - a和**pp即可。
修复后的完整代码如下:
#include<stdio.h> // 标准写法建议用int main(void)代替void main() int main(void) { int a[]= {10,20,30,40,50,60}; int *p[]= {a,a+1,a+2,a+3,a+4,a+5}; int **pp=p; pp++; printf("%d,%d,%d\n", pp-p,*pp-a, **pp); *pp++; // 把原来的两处*pp-p改为*pp-a和**pp即可 printf("%d,%d,%d\n", pp-p, *pp-a, **pp); ++*pp; printf("%d,%d,%d\n", pp-p, *pp-a, **pp); ++**pp; printf("%d,%d,%d\n", pp-p, *pp-a, **pp); return 0; }
如果你的实际需求是计算*pp对应的值在p数组中的下标偏移,也可以直接用(*pp - a),因为p数组的元素本身就是按a数组的地址偏移依次赋值的,结果和预期一致。
运行结果说明
修复后代码的运行结果为:
1,1,20 2,2,30 2,3,40 2,3,41
内容的提问来源于stack exchange,提问作者Vikas Verma
相关产品推荐
相关产品推荐

