9. 二维数组在内存中的存储
像一维数组一样,我们如果想研究二维数组在内存中的存储方式,我们也是可以打印出数组所有元素的地址的。代码如下:
#include <stdio.h>
int main()
{
int arr[3][5] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
输出的结果:
从输出的结果来看,每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以二维数组中的每个元素都是连续存放的。
如下图所示:
10. C99中的变长数组
在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式,或者如果我们初始化数据的话,可以省略数组大小。
如:
int arr1[10];
int arr2[3+5];
int arr3[] = {1,2,3};
这样的语法限制,让我们创建数组就不够灵活,有时候数组大了浪费空间,有时候数组又小了不够用的。
C99中给一个变长数组(variable-length array,简称 VLA)的新特性,允许我们可以使用变量指定
数组大小。
请看下面的代码:
int n = a+b;
int arr[n];
上面示例中,数组arr 就是变长数组,因为它的长度取决于变量n 的值,编译器没法事先确定,只
有运行时才能知道n 是多少。
变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化。它的好处是程序员不必在开发时,随意为数组指定一个估计的长度,程序可以在运行时为数组分配精确的长度。有一个比较迷惑的点,变长数组的意思是数组的大小是可以使用变量来指定的,在程序运行的时候,根
据变量的大小来指定数组的元素个数,而不是说数组的大小是可变的。数组的大小一旦确定就不能再变化了。
遗憾的是在VS2022上,虽然支持大部分C99的语法,没有支持C99中的变长数组,没法测试;下面是我在gcc编译器上测试,可以看一下。
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);//根据输入数值确定数组的大小
int arr[n];
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
第一次测试,我给n中输入5,然后输入5个数字在数组中,并正常输出
第二次测试,我给n中输入10,然后输入10个数字在数组中,并正常输出