c语言中向函数传递二维矩阵的方法
在C语言中,向函数传递二维数组有几种方式,这主要取决于二维数组的大小是否已知。下面是几种常见的方式:
1)如果二维数组的大小已知,那么你可以在函数参数中直接指定数组的大小。例如: void func(int arr[10][10]) { ... } 在这个例子中,func函数接受一个10x10的二维数组作为参数。
2)如果二维数组的第一维的大小未知,但是第二维的大小已知,那么你可以只指定第二维的大小。例如: void func(int arr[][10], int size) { ... } 在这个例子中,func函数接受一个二维数组作为参数,数组的第二维的大小是10,第一维的大小是size。
3)如果二维数组的大小完全未知,那么你可以将其视为一个指针的指针。例如: void func(int **arr, int rows, int cols) { ... } 在这个例子中,func函数接受一个指针的指针作为参数,然后使用rows和cols参数来获取数组的大小。
需要注意的是,如果你选择使用指针的指针来表示二维数组,那么你需要使用动态内存分配(例如malloc或者calloc函数)来创建二维数组,并在使用完后使用free函数来释放内存。
int sum2DArray(int **arr, int *start, int *end) { int sum = 0; // int *p = *arr; int *p = NULL; p = start; while (p < end) { sum += *p; p++; } return sum; } void main(){ int arr1[3][4] = {0}; int arr2[3][4] = {0}; int arr3[3][4] = {0}; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { arr1[i][j] = i + j; arr2[i][j] = i - j; arr3[i][j] = i * j; } } int *ptr_arr_start = &arr2; int *ptr_arr_end = &arr2 + 1; sum = sum2DArray(arr2, ptr_arr_start, ptr_arr_end); }
但是上面有错误
int sum2DArray(int *start, int *end) { int sum = 0; int *p = start; while (p < end) { sum += *p; p++; } return sum; } void main(){ int arr1[3][4] = {0}; int arr2[3][4] = {0}; int arr3[3][4] = {0}; int i, j, sum; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { arr1[i][j] = i + j; arr2[i][j] = i - j; arr3[i][j] = i * j; } } int *ptr_arr_start = &arr2[0][0]; int *ptr_arr_end = &arr2[2][3] + 1; sum = sum2DArray(ptr_arr_start, ptr_arr_end); printf("Sum of elements in arr2: %d\n", sum); }
或者
int sum2DArray(int arr[3][4], int rows, int cols) { int sum = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { sum += arr[i][j]; } } return sum; } void main(){ int arr1[3][4] = {0}; int arr2[3][4] = {0}; int arr3[3][4] = {0}; int i, j, sum; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { arr1[i][j] = i + j; arr2[i][j] = i - j; arr3[i][j] = i * j; } } sum = sum2DArray(arr2, 3, 4); printf("Sum of elements in arr2: %d\n", sum); }
还有一种,是保存每一行首元素的地址,这里传入函数的p
是一个二级指针,p[i]
就已经是一个一级指针了,可以直接使用p[i][j]
来访问二维数组的元素
main函数中的 int *p[3]就是一个指针数组,用于保存一个二维数组每一行首元素的地址
int sum2DArrayMethod3(int **p, int rows, int cols) { int sum = 0; int i = 0, j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { sum += p[i][j]; printf("the element of row: %d col: %d is %d\n", i, j, p[i][j]); } } return sum; } void main{ int rows = 3; int cols = 4; // sum2 = sum2DArrayMethod2(arr2, rows, cols); int *p[3] = {NULL}; for (i = 0; i < rows; i++) { p[i] = &arr2[i][0]; } sum2 = sum2DArrayMethod3(p, rows, cols); }
可以修改为
int sum2DArray(int arr[3][4], int rows, int cols) { int sum = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { sum += arr[i][j]; } } return sum; } int main(){ int arr1[3][4] = {0}; int arr2[3][4] = {0}; int arr3[3][4] = {0}; int i, j, sum; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { arr1[i][j] = i + j; arr2[i][j] = i - j; arr3[i][j] = i * j; } } sum = sum2DArray(arr2, 3, 4); printf("Sum of elements in arr2: %d\n", sum); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现