You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:13:32