#include <stdio.h>
// 函数声明
void sumRows(int (*matrix)[4], int rows);
int main() {
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
sumRows(matrix, 3);
return 0;
}
void sumRows(int (*matrix)[4], int rows) {
int sums[rows];
for (int i = 0; i < rows; i++) {
sums[i] = 0;
for (int j = 0; j < 4; j++) {
sums[i] += *(*(matrix + i) + j);
}
printf("第 %d 行的和为: %d\n", i + 1, sums[i]);
}
}
int (*matrix)[4]
指针形式的意义
int (*matrix)[4]
是一个指向含有4个 int
类型元素的数组的指针。
- 在C语言中,二维数组名本质上是一个指向其首行的指针。这里的
matrix
指针就用来接收这个二维数组首行的地址。由于每一行有4个 int
类型元素,所以指针 matrix
指向的对象是一个包含4个 int
类型元素的数组。
函数中指针的使用方式
- 通过
*(matrix + i)
来访问第 i
行的首地址,matrix
本身是指向首行的指针,matrix + i
就是指向第 i
行的指针,解引用 *(matrix + i)
得到第 i
行的首地址。
- 再通过
*(*(matrix + i) + j)
来访问第 i
行第 j
列的元素,*(matrix + i)
得到第 i
行首地址,*(matrix + i) + j
则是第 i
行第 j
列元素的地址,再解引用一次就得到该元素的值。
注意事项
- 数组访问越界问题:必须确保
i
的范围是 0
到 rows - 1
,j
的范围是 0
到 3
,否则会导致未定义行为。
- 指针类型一致性:函数参数声明的指针类型必须与传入的实际参数类型一致,这里传入的二维数组每一行必须是4个
int
类型元素,否则会出现类型不匹配的问题。
- 内存管理:在函数内部定义的
sums
数组是局部数组,其生命周期仅限于函数内部。如果需要在函数外部使用 sums
数组的内容,可以考虑通过动态内存分配(如 malloc
)并返回指针,或者将 sums
数组作为函数参数传入。