关于对变长数组的理解

起因是我在尝试自己制作扫雷游戏的时候编辑了一段代码,发现我对于数组的理解十分浅薄

#include "game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
 int i = 0;
 for (i = 0; i < rows; i++)
 {
 int j = 0;
 for (j = 0; j < cols; j++)
 {
 board[i][j] = set;
 }

这是一段初始化二维数组棋盘为任意变量set的代码,而我在编辑board[i][j]时将其编辑char board[i][j],我百思不得其解,为何在VS2022的编辑器上频频报错,然后我回过去对数组方面的知识进行回顾,对于数组又有了更深的理解。

首先是我们要明白char board[i][j]和board[i][j]的区别

1.board[i][j]

这是对一个名为board的二维数组中的元素的引用形式。这里假设board已经被定义为二维数组(通常是char类型或者可以转换为char类型的表达式计算结果类型),并且i和j是合法的索引值。例如,如果board是一个char类型的二维数组,已经被正确定义(如char board[3][4];),那么board[i][j]表示访问这个二维数组中第i行第j列的元素。这仅仅是一种访问已存在数组元素的操作,没有涉及数组的定义。

2.char board[i][j]

在 C99 标准下(对于 C 语言),这是定义一个二维的变长数组的形式。其中i和j需要是在运行时能够确定值的表达式(通常是变量)。

例如: 

   int m = 3;
   int n = 4;
   char board[m][n];//定义了一个二维的变长数组,其行大小为m,列大小为n

与前面不同的是,这是在创建一个新的数组,并且这个数组的类型是char,其大小是由变量决定的,而不是像char board[3][4];这种编译时就确定大小为 3 行 4 列的普通二维数组定义。

然后就是我们要明白什么是变长数组

变长数组是一种数组类型,它的大小不是在编译时确定的常量,而是在运行时确定的。

看似是一个很简单的一句话,但我在代码运行的过程中就产生了许多疑惑,这也证明了代码实践相对于理论来说重要的不止一点两点。

接下来就可以很好地解释为什么char board[i][j]会出错了

1.char board[i][j]是一个数组,board[i][j]是数组中的一个元素,在VS2022中对于一个数组来说,数组定义长度不能用变量。变量会使数组的大小时刻处于变化状态或者说是不确定状态下,这是因为 C++ 强调类型安全性和编译时的确定性,所以在定义数组时只能用常量,而对于元素来说就不会有此类问题。

2.因为这块board这个二维数组已经存在,这块的话加个char就代表每次进入循环就新定义一个二维数组,这会导致编码错乱

我们又可以思考以下例子是否正确

int set = 0;
int arr[4][5] = {set};

56b61fe89d5c4015bc046d7dff787889.png
 

通过运行我们发现是可行的,根据变长数组,因为set这个变量去初始化了每个数组元素,而不是数组的大小

最后总结一下

在遇到编写代码报错的时候,回归定义或许是一个很好的选择,当你认为你觉得你理解了一个概念的定义时,其实不然,在写代码时还是会报错,可能就是你忽略了定义中的某一点,在回顾的过程中甚至把循环结构的写法再复习了一遍

希望这篇文章能对你们有帮助,以上是我的个人见解

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值