You need to enable JavaScript to run this app. C语言编写两数组交集代码遇pointer-to-object报错,困惑指针使用时机
优惠活动
大模型
产品
解决方案
定价
更多

C语言编写两数组交集代码遇pointer-to-object报错,困惑指针使用时机

报错的直接触发原因

你代码里标记的两处pointer-to-object报错,根源完全一致:
函数形参把fArr、sArr定义成了单个int类型变量,而非可用于内存寻址的指针类型。
C语言的下标访问运算符arr[i]本质是对指针做偏移寻址,等价于*(arr + i),要求运算符左侧的操作数必须是指向可访问内存块的指针。你现在把fArr、sArr设置成单个整数值,编译器自然无法识别你要做数组访问,因此提示需要传入符合要求的指针类型。

实际开发中指针的核心使用场景
  • 跨函数传递数组:数组作为函数参数传递时会退化为指向首元素的指针,无需拷贝整个数组的内容到函数栈,可大幅降低传参开销,这也是数组处理类函数必须用指针接收参数的核心原因
  • 让函数直接修改外部变量的值:如果不使用指针,函数拿到的只是外部变量的临时拷贝,对拷贝的修改不会影响原变量;传指针时函数可以直接通过地址修改原内存中的值
  • 动态内存管理:程序运行时才能确定大小的内存块(比如长度不固定的数组),需要用指针存储内存块的首地址完成读写
  • 实现复杂数据结构:链表、树、图这类需要节点互相关联的结构,必须用指针才能实现节点间的指向关系
现有代码的逻辑缺陷

除了参数类型的编译错误,当前求交集的逻辑本身也无法输出正确结果:

  • 错误使用两个数组的最大长度作为结果数组的长度:交集的元素数量不可能超过两个数组中长度更短的数组的元素数
  • 循环逻辑存在断层:内层j循环刚完成第一次判断就执行break,根本无法遍历完第二个数组的所有元素匹配公共值
  • 结果数组的写入逻辑错误:一旦匹配到公共元素,就遍历整个结果数组做赋值,最终结果会被同一个元素反复覆盖
  • 缺少去重逻辑:如果原数组存在重复值,匹配到的公共元素会被重复写入结果数组
修正后的基础实现
void arrIntersect(int *fArr, int *sArr, int fArrElem, int sArrElem)
{
    int i = 0, j = 0, k = 0;
    // 交集数组最大长度不超过短数组的元素数
    int minArrElem = (fArrElem < sArrElem) ? fArrElem : sArrElem;
    int intersectArr[minArrElem];

    // 双指针遍历匹配公共元素
    while (i < fArrElem && j < sArrElem)
    {
        if (fArr[i] == sArr[j])
        {
            // 简单去重:和结果数组最后一个值不相等才写入
            if (k == 0 || intersectArr[k-1] != fArr[i])
            {
                intersectArr[k] = fArr[i];
                k++;
            }
            i++;
            j++;
        }
        else if (fArr[i] < sArr[j])
        {
            i++;
        }
        else
        {
            j++;
        }
    }

    for (int idx = 0; idx < k; idx++)
    {
        printf("%d, ", intersectArr[idx]);
    }
}

注:上述双指针实现默认传入的两个数组为已排序状态,如果数组无序,需要先对两个数组做排序再执行匹配逻辑。

内容的提问来源于stack exchange,提问作者Birinder Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.14 04:36:08