首页 > 其他分享 >C语言:变长数组(VLA)

C语言:变长数组(VLA)

时间:2022-09-01 17:50:00浏览次数:65  
标签:arr rows 形参 VLA cols C语言 int 数组

VLA

C99新增了变长数组(variable-length array VLA),允许使用变量表示数组的维度。如下所示:

int quarters = 4;
int regions = 5;
double sales[regions][quarters];    // 一个变长数组(VLA)

变长数组有一些限制。变长数组必须是自动存储类别,这意味着无论在函数中声明还是作为函数形参声明,都不能使用staticextern存储类别说明符,而且不能再声明中初始化变长数组。最终C11把变长数组作为一个可选特性,而不是必须强制实现的特性。

注意:变长数组不能改变大小

变长数组中的“变”不是指可以修改已创建数组的大小。一旦创建了变长数组,它的大小则保持不变。这里的“变”指的是:在创建数组时,可以使用变量指定数组的维度。

下面我们来看一个简单的例子:如何编写一个函数,计算int的二维数组所有元素之和。

首先,要声明一个带二维变长数组参数的函数,如下所示:

int sum2d(int rows, int cols, int ar[rows][cols]); // ar是一个变长数组(VLA)

注意前两个形参(rowscols)用作第3个形参二维数组ar的两个维度。因为ar的声明要使用rowscols,所以在形参列表中必须在声明ar之前先声明这两个形参。

C99/C11标准规定,可以省略原型中的形参名,但是在这种情况下,必须用星号来代替省略的维度:

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

其次,该函数的定义如下:

int sum2d(int rows, int cols, int arr[rows][cols]) {
    int sum = 0;
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            sum += arr[i][j];
        }
    }
    return sum;
}

下面程序演示了以变长数组作为形参的函数既可处理传统C数组,也可处理变长数组。

#include <stdio.h>

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

int main() {
    int rows = 10;
    int cols = 20;
    int arr[rows][cols];
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            arr[i][j] = j;
        }
    }
    int result = sum2d(rows, cols, arr);
    printf("VLA %d\n", result);

    int arr2[5][5] = {
            {1,2,3,4},{1,2,3,4},{1,2,3,4}
    };

    int result2 = sum2d(5, 5, arr2);
    printf("%d\n", result2);

    return 0;
}

int sum2d(int rows, int cols, int arr[rows][cols]) {
    int sum = 0;
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            sum += arr[i][j];
        }
    }
    return sum;
}

输出如下:

image-20220901172341632

需要注意的是,在函数定义的形参列表中声明的变长数组并未实际创建数组。和传统的语法类似,变长数组名实际上是一个指针。这说明带变长数组形参的函数实际上是在原始数组中处理数组,因此可以修改传入的数组。

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

变长数组还允许动态内存分配,这说明可以在程序运行时指定数组的大小。普通C数组都是静态内存分配,即在编译时确定数组的大小。由于数组大小是常量,所以编译器在编译时就知道了。

标签:arr,rows,形参,VLA,cols,C语言,int,数组
From: https://www.cnblogs.com/wwjj4811/p/16647317.html

相关文章

  • 日常开发记录-elementUI 文件上传假删除,防止删除文件后后悔的操作,无需调用后端删除文
    此篇博客关键是记录这种假删除的思想,后端给的删除接口也不一定非要用。。。上传文件假删除:<template><div><el-uploadclass="upload-demo"ac......
  • 如何在 Javascript 中清空数组?
    如何在Javascript中清空数组?在使用JavaScript编程时,程序员可能需要在许多情况下将数组设为空,一个非常常见的问题是如何清空数组并删除其所有元素!顺便说一句,这是最受......
  • C# 数组使用 For 循环改变颜色
    C#数组使用For循环改变颜色目标:用For循环改变颜色现在我们将ForEach循环更改为一个For循环,它与我们对ForEach循环所做的事情相同。所以,不同的是for循环......
  • js创建二维数组
    js创建二维数组的方法:方法一:直接设置letarr=[];arr[0]=[1,2,3,4,5,6];arr[1]=[10,20,30,40,50,60]方法二: fill+一个for循环letarr=newArray(1......
  • 高级开发人员知识:JavaScript 数组方法第 3 部分
    高级开发人员知识:JavaScript数组方法第3部分今天让我们来点高级的。这些数组方法总是遍历数组。基本上,您可以通过基本的for循环获得相同的功能。如果是这样,我们为什......
  • 获取数组元素
    这里有一个数组叫a1,数组内容为'red','green','yellow'。如果想直接获取'yellow',可通过他们的标号来获取,因为每一个值都是有标号的,从0开始,0,1,2,3……数组内容的标号......
  • perl 数组嵌套入哈希内
    这里是指数组作为hash的value,即一个key对应多个值这里利用perl中的特殊句柄DATA做示例用以备忘{perl数据结构一旦复杂点,可读性急剧下降,坑......
  • JavaScript之数组常用API
    这篇文章主要帮助大家简单理解数组的一些常用API用法,许多小伙伴常用方法记不住?别急,看完下面的介绍您一定就会明白各个方法是如何用的了......
  • 稀疏数组
    基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:1、记录数组一共有几行几列,有多少个不同的值2......
  • 稀疏数组
    基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法:1.记录数组一共有几行几列,有多少不同的值2.......