C语言中仅函数参数可将数组表示法转换为指针表示法?
C语言函数接收多维数组的学习笔记
最近在啃Stephen Prata的《C Primer Plus》(第6版),刚好学到函数怎么接收多维数组这块,把书中的重点和自己琢磨明白的点整理出来:
一、书中给出的多维数组函数声明方式
针对多维数组(拿二维数组int arr[3][5]举例),书中提到函数可以用这几种方式声明:
- 明确所有维度的大小:
void handle_2d_arr(int arr[3][5]); - 省略第一维的大小(因为数组传参时第一维会退化),但必须保留后续维度:
void handle_2d_arr(int arr[][5]);
二、形参为指针时的特殊写法
当且仅当pt作为函数形参时,还有一种等价的声明方式——用指向数组的指针来表示:
void handle_2d_arr(int (*pt)[5]);
这里一定要注意(*pt)的括号不能丢!要是写成int *pt[5],那就是一个包含5个int*类型元素的指针数组,和我们要的指向一维数组的指针完全不是一回事。
三、关于数组退化的理解
我自己梳理了下这个核心逻辑:在C语言里,数组作为实参传入函数时,都会退化成对应类型的指针。比如:
- 一维数组
int arr[5]传入函数,会退化成int *类型的指针; - 而二维数组
int arr[3][5]本质是由3个int[5]类型的一维数组组成的,所以它退化成的是指向int[5]类型数组的指针,也就是上面提到的int (*pt)[5]。
这也是为什么多维数组传参时,除了第一维,后面的维度必须明确指定——编译器得知道每个“子数组”的大小,才能正确计算指针偏移的步长,不然就没法在多维数组里正确寻址了。
顺便提一句,《C Primer Plus》里特意强调了这个点,要是随便省略后面的维度,编译器直接就懵了。
内容的提问来源于stack exchange,提问作者Thor
相关产品推荐
相关产品推荐

