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
相关产品推荐
相关产品推荐

