#include <stdio.h>
// 接受数组指针作为参数的函数
int sumWithArrayPointer(int (*arr)[3], int rows) {
int sum = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 3; j++) {
sum += arr[i][j];
}
}
return sum;
}
// 接受指针数组作为参数的函数
int sumWithPointerArray(int **arr, 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 twoDArray[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
// 调用接受数组指针的函数
int sum1 = sumWithArrayPointer(twoDArray, 2);
printf("使用数组指针的和: %d\n", sum1);
// 准备指针数组
int *ptrArray[2];
for (int i = 0; i < 2; i++) {
ptrArray[i] = twoDArray[i];
}
// 调用接受指针数组的函数
int sum2 = sumWithPointerArray(ptrArray, 2, 3);
printf("使用指针数组的和: %d\n", sum2);
return 0;
}
数组指针和指针数组作为函数参数的不同之处及适用场景
- 不同之处:
- 数组指针:本质是一个指针,指向一个数组。在函数参数中,它的类型为
int (*arr)[n]
,其中n
是数组的列数。这种形式可以直接使用二维数组的下标访问方式arr[i][j]
,编译器知道数组的列数,在内存访问时能够正确计算偏移量。
- 指针数组:本质是一个数组,数组中的元素是指针。在函数参数中,它的类型为
int **arr
。使用这种形式时,编译器不知道数组的列数,需要额外传递列数参数。并且访问元素时,也是通过指针偏移来实现arr[i][j]
的效果。
- 适用场景:
- 数组指针:适用于二维数组在内存中是连续存储的情况,比如静态分配的二维数组。这种方式代码简洁,编译器可以更好地进行优化,对于固定维度的二维数组操作非常方便。
- 指针数组:适用于二维数组的列数可能不同(即所谓的“锯齿数组”),或者二维数组是动态分配内存的情况。因为指针数组中的每个指针可以指向不同长度的数组,更加灵活,但同时代码实现会相对复杂一些,需要更多的内存管理操作。