#include <stdio.h>
// 函数定义
void printArray(int (*ptr)[4], int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", ptr[i][j]);
}
printf("\n");
}
}
int main() {
int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
printArray(arr, 3);
return 0;
}
多维数组指针与普通数组名作为参数的不同及原因
- 多维数组指针作为参数
- 不同点:在函数定义
void printArray(int (*ptr)[4], int rows)
中,ptr
是一个指向包含4个 int
元素的数组的指针。这种方式明确指定了数组第二维的大小,在函数内部可以像使用二维数组一样通过 ptr[i][j]
来访问元素。
- 原因:编译器需要知道数组第二维的大小,以便在内存中正确地计算偏移量来访问每个元素。因为二维数组在内存中是按行顺序存储的,知道第二维大小才能准确地定位到每一个元素。
- 普通数组名作为参数
- 不同点:当普通数组名作为参数传递时,在函数调用处,数组名会自动退化为指向数组首元素的指针。例如
int arr[3][4]
,传递给函数时,arr
变成了 int (*)[4]
类型的指针。与多维数组指针不同的是,数组名在函数内部不能像在定义处那样通过 sizeof
操作符获取数组的总大小,因为它已经退化为指针。
- 原因:C语言的设计理念中,数组名在大多数表达式中会被隐式转换为指针,以方便函数参数传递,这样可以减少内存开销(因为只传递指针而不是整个数组的副本)。但同时也丢失了数组的一些元信息,比如数组的大小。