当前位置: 首页 > news >正文

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

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

示例代码:

#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数组是静态存储分配,数组大小在编译时已经确定(因为数组大小是常量,所以编译器可以得到这些信息)

 

http://www.lryc.cn/news/27712.html

相关文章:

  • 物联网WEB大屏数据可视化
  • 新:DlhSoft Gantt Chart for WPF Crack
  • C++基础(一)—— C++概述、C++对C的扩展(作用域、struct类型、引用、内联函数、函数默认参数、函数占位参数、函数重载)
  • Rust学习总结之if,while,loop,for使用
  • Java知识复习(十一)RabbitMQ
  • thinkphp图片压缩类
  • 如何将图数据库应用于电影智能推荐
  • CSS实现动画效果的菜单收起展开图标,html实现动画效果的箭头
  • 大数据平台小结
  • 力扣-139单词拆分
  • 图机器学习-图神经网络
  • 配置Airbyte资源限制
  • python实现PCA降维画分类散点图并标出95%的置信区间
  • Mysql高级之索引结构详解
  • 【线程-J.U.C】
  • docker布署spring boot jar包项目
  • 极简Vue3教程--Pinia状态管理
  • 常用的map转bean互转方法
  • 2.4G收发一体芯片NRF24L01P跟国产软硬件兼容 SI24R1对比
  • 设计模式之七大原则(一)——单一职责原则、开放-关闭原则
  • C++ set、unordered_set、multiset它们之间的区别与一些使用方法(不断更新)
  • hadoop调优
  • EM@三角函数诱导公式
  • 是不是只能学IT互联网技术才有发展前途?
  • Linux 进程:exit和_exit的辨析
  • 智能电子标签——商超版价签
  • 计算机网络自检
  • DC真实数据都有哪些?Filecoin为DC数据存储的解决方案又是什么?
  • 解决vscode无法自动更新
  • 315线上知识竞赛答题活动方案及模板分享