变长数组(VLA)

在学习二位数组的函数中可能不太理解,为什么只把行数作为函数的形参。例如:

#include <stdio.h>
#define M 3
#define N 2
void show_print(int ar[][N],int row);
int main(void)
{
	int num[N][M] = {{1,2,3},{4,5,6}};
	
	show_print(num,N);		//函数调用
}
void show_print(int ar[][N], int row){
	//.....
}

在其中我们会发现从常量的定义、数组声明、函数的声明、函数调用、函数的定义都会发现它的列数都是固定的。当我们调用多次类似相同的函数时,会发现没有任何的问题。那么当创建任意大小二维数组函数时,就会不行了,例如 6x5的数组。

注意: 因为C规定,数组的维数必须时常量,不能用变量代替。

所以C99新增了变长数组(variable-length array, VLA),允许使用变量表示数组的维度。
VLA这个小东西,一开始懵懂无知我也认为是可以让数组边长。哈哈哈,想比大家都有这个想法,所以在这里解释以下VLA指的是什么。

变长数组中的变不是指可以修改已经创建的数组的大小。因为一旦创建数组后,它的大小是不会被改变的。所以呢这个“变”指的是,在定义数组时,可以在方括号中使用变量。

任何东西都不可能十全十美,所以边长数组也会有一些相应的限制。C语言规定VLA必须是自动存储类别,所以在声明时不能使用static或extern存储类别说明符。并且不能再声明中初始化他们,所以C11新增的VLA特性是可选的,不是强制的。

定义变长数组

int quarters = 4;
int regions = 5;
double sales[quarters][regions];

在前面我们提到变长数组其实就是可以在方括号中使用变量表示数组的维度。所以声明就是把变量放进去呗。

C99/C11允许在声明变长数组时使用const变量。所以改数组的定义必须时声明在块中的自动存储类别数组。

声明二位数组变长数组参数的函数

int sum2d(int rows, int clos,int ar[rows][clos]);

注意问题:在函数的形参中,我们知道变长数组的维度是变量,所以在使用之前我们要声明变量。所以在形参列表中必须在声明ar之前声明这个形参。
另外,C99/C11标准规定,可以省略原型中的形参名,但是在这种情况下,必须用星号来代替省略的维度。例如下面的代码:

int sum2d(int, int,int ar[*][*]);

但是函数的定义还是一样,如下所示:

int sum2d(int rows, int clos,int ar[rows][clos])
{
	//内容
}

变长数组还允许动态分配内容空间,比如在程序的运行过程中,允许输入数字进行设置数组的维度。而普通C数组不可以。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值