变长数组(VLA)
之前处理二维数组的函数中可能不太理解,为何只把数组的行数作为函数的形参,而列数却内置在函数体内,如下:
假设声明了下列数组:
int ar1[5][4];
int ar2[100][4];
int ar3[2][4];
可以用sum2d()函数分别计算这些数组的元素之和,之所以能,是因为这些数组的列数固定为4,而行数被传递给形参rows,它是一个变量。如果我们变更列数的话:6行5列的数组,就不能使用这个函数了,需要重建一个COLS为5的函数。因为C规定,数组的维数必须是常量,不能用变量代替COLS。
鉴于此,C新增了变长数组(Variable-length array, VLA),运行使用变量便是数组的维度,如下:
int quarters = 4;
int regions = 5;
double sales[ quarters ][ regions ]; //一个变长数组
注意变长数组有一些限制,它必须是自动存储类别,不能是static或extern存储类别,而且不能在声明中初始化他们。
变长数组不是改变大小,创建之后大小依旧是固定的;“变长”指的是在创建时可以指定数组的维度
使用VLA来修改一个sum2d()函数:
需要注意的是,在函数定义的形参中声明的变长数组并未时间创建数组。和传统的语法类似,变长数组名实际上是一个指针。这说明带变长数组形参的函数实际上是在原始数组中处理数据,因此可以修改传入的数组。
const和数组大小
C90标准不允许变长数组使用const变量;
C99/C11运行使用。
变长数组还允许动态内存分配,可以在程序运行时指定数组的大小。普通C数组都是静态内存分配,即在编译时确定数组大小。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具