You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:36:04