在学习二位数组的函数中可能不太理解,为什么只把行数作为函数的形参。例如:
#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){
//.....
}
在其中我们会发现从常量的定义、数组声明、函数的声明、函数调用、函数的定义都会发现它的列数都是固定的。当我们调用多次类似相同的函数时,会发现没有任何的问题。那么当创建任意大小二维数组函数时,就会不行了,例如 6×5的数组。
注意: 因为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数组不可以。
今天的文章变长数组(VLA)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/59828.html