使用指针传递三维数组至ADD函数求和遇传参问题求助
解决三维数组指针传递与累加的问题
看起来你的代码在数组传递方式、循环逻辑和函数调用这几个地方都踩了坑,咱们一步步拆解问题,然后修正代码:
先说说你的代码里的核心问题
- 函数调用参数错误:你定义了
int(*pA)[COL][HIT] = A;,这是指向三维数组的指针,但调用ADD((*pA)[COL][HIT])时,你传递的是数组的一个单个元素值(而且(*pA)[COL][HIT]已经是越界的索引了),而不是函数需要的指向三维数组的指针。正确的调用应该是直接传pA或者A。 - 循环逻辑完全错误:你的for循环里
(*pA)[COL][HIT] = 0是在修改数组元素的值,而且用这个作为循环变量完全不符合遍历逻辑。你想要的是指针递增遍历,应该用一个扁平的指针来逐个访问数组元素,而不是用三维索引去硬凑总长度。 - 函数声明缺失:
ADD函数定义在main函数之后,没有提前声明,编译器会默认它返回int,但参数类型不匹配会导致编译错误。
修正后的代码示例
假设你的三维数组是int A[ROW][COL][HIT];(这里补充了ROW宏,对应你提到的总元素数1076,所以设定ROW=10,COL=7,HIT=6),修正后的代码如下:
#include <stdio.h> #include <stdlib.h> // 定义数组维度宏 #define ROW 10 #define COL 7 #define HIT 6 // 提前声明ADD函数 int ADD(int (*pA)[COL][HIT]); int main() { // 示例三维数组,可替换为你的实际初始化逻辑 int A[ROW][COL][HIT] = {0}; // 赋几个测试值方便验证求和结果 A[0][0][0] = 1; A[0][0][1] = 2; A[9][6][5] = 3; // 指向三维数组的指针,直接赋值数组名即可 int (*pA)[COL][HIT] = A; // 正确调用ADD函数,传递指向三维数组的指针 printf("Sum Of Array A : %d\n", ADD(pA)); system("pause"); return 0; } int ADD(int (*pA)[COL][HIT]) { int sum = 0; // 将三维数组指针转换为扁平的int指针,方便逐个遍历元素 int *p = (int *)pA; // 遍历所有元素:总元素数为ROW*COL*HIT for (int i = 0; i < ROW * COL * HIT; i++) { sum += *p; // 指针递增,访问下一个元素 p++; } return sum; }
关键逻辑解释
- 数组指针的传递:
int (*pA)[COL][HIT]是指向COL×HIT二维数组的指针,正好匹配三维数组A[ROW][COL][HIT]的每一个“切片”,传递数组名A或者指向它的指针pA都是正确的。 - 指针递增进遍历:C语言中多维数组在内存里是连续存储的,把三维数组指针强制转换成
int*类型后,就可以像遍历一维数组一样逐个递增指针,高效访问每一个元素。 - 避免越界:用总元素数
ROW*COL*HIT作为循环终止条件,确保不会访问到数组以外的内存。
如果你想完全不用下标,只靠指针操作,也可以这样写循环(和上面逻辑等价):
int ADD(int (*pA)[COL][HIT]) { int sum = 0; int *start = (int *)pA; int *end = start + ROW * COL * HIT; while (start < end) { sum += *start++; } return sum; }
内容的提问来源于stack exchange,提问作者TaeHyeong Kim
相关产品推荐
相关产品推荐

