再学C语言41:变长数组(VLA)

文章介绍了C99标准引入的变长数组特性,允许在函数中使用变量定义数组的维度。变长数组必须在函数内部声明,且其大小在创建后不变。文中提供了一个计算二维数组元素和的函数示例,展示了如何声明、定义和使用带有变长数组参数的函数。通过变长数组,程序员可以在运行时动态指定数组大小,增强了代码的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

处理二维数组的函数:数组的行可以在函数调用时传递,但是数组的列只能被预置在函数内部

示例代码:

#define COLS 4
int sum(int arr[][COLS], int rows)
{
    int r;
    int c;
    int temp = 0;

    for(r = 0; r < rows; r++)
    {
        for(c = 0; c < COLS; c++)
        {
            temp += arr[r][c];
        }
    }
    return temp;
}

假设定义数组array[3][4],函数调用形式为:

sum_arr = sum(array, 3); // 行数可以以参数形式传递给参量rows

这是因为数组的维数必须是常量,不能用一个变量代替COLS


C99引入变长数组,允许使用变量定义数组各维

int a = 3;
int b = 4;
int array[a][b]; // 一个变长数组

变长数组的限制:必须是自动存储类,意味着变长数组必须在函数内部或作为函数参量声明,并且声明时不可以进行初始化

变长数组的大小不会变化:变长数组的大小在创建之后保持不变,“变”的意思是数组的维数可以使用变量进行指定

1)函数声明

如何声明带有一个二维变长数组参数的函数:

int sum(int r, int c, int arr[r][c]); // arr是一个变长数组
                                      // 前面两个参量作为数组参量arr的维数
                                      // 因为arr的声明中使用了r和c
                                      // 所以r和c的声明需早于arr

C99标准规定,可以省略函数原型中的名称;如果省略名称,需用*代替省略的维数

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

2)函数定义

int sum(int r, int c, int arr[r][c])
{
    int i, j;
    int temp = 0;

    for(i = 0 ; i < r; i++)
    {
        for(j = 0; j < c; j++)
        {
            temp += arr[i][j];
        }
    }
    return temp;
}

区别古典C,函数定义时,用变量c代替常量COLS,因为使用了变长数组

3)函数使用

示例代码:

#include <stdio.h>

int sum(int r, int c, int arr[r][c]);

int main(void)
{
    int rows = 3;
    int cols = 5;
    int i, j;

    int array_1[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };

    int array_v[rows][cols];
    for(i = 0; i < rows; i++)
    {
        for(j = 0; j < cols; j++)
        {
            array_v[i][j] = i * j;
        }
    }

    printf("3 * 4 array:\n");
    printf("sum of all elements is %d\n", sum(3, 4, array_1));

    printf("3 * 5 VAL:\n");
    printf("sum of all elements is %d\n", sum(rows, cols, array_v));
}

int sum(int r, int c, int arr[r][c])
{
    int i, j;
    int temp = 0;

    for(i = 0; i < r; i++)
    {
        for(j = 0; j < c; j++)
        {
            temp += arr[i][j];
        }
    }
    return temp;
}

运行结果:

7f8487cbc55846c3a88e2189a648d63f.png

变长数组允许动态分配存储单元,可以在程序运行时指定数组的大小

常规的C数组是静态存储分配,数组大小在编译时已经确定(因为数组大小是常量,所以编译器可以得到这些信息)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forster-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值