变长数组(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数组都是静态内存分配,即在编译时确定数组大小。

posted @   星雨boy  阅读(397)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示