目录
引言
上一章节我们学习了一维数组,而我们知道数组分为一维数组和多维数组,而多维数组一般比较多见的是二维数组;此外,还有一种特殊的数组—变长数组。本章我们便来学习一下二维数组与变长数组;
1.二维数组的创建
1.1二维数组的概念
在我们学习了一维数组之后,我们知道,数组的元素都是内置的,当我们把一维数组作为数组的元素的时候,所构成的数组就被成为二维数组;二维数组作为元素构成的数组为三维数组;而二维数组以上的数组就叫做多维数组;
1.2二维数组的创建
那么我们如何创建二维数组呢?
如下示例代码:
// type arr_name[常量值][常量值]
// 例如:
int arr[3][5];
char ch[6][6];
float fl[5][5];
解释一下上述代码出现的信息:
- 3表示数组有三行
- 5表示每行有五个元素
int
表示数组中的元素为整数类型arr
是数组名,可以根据自己的需要指定名字;
如一维数组一样 :
type
表示数组中存储的元素的类型;arr_name
表示数组名称;- 第一个
[]
中的常量值表示二维数组的行,第二个[]
中的常量值表示二维数组的列;
2.二维数组的初始化
在创建变量或数组的时候,给定一些初始值,就叫做初始化;
那么二维数组是如何初始化的呢?同一维数组一样,也是用大括号进行初始化的;
2.1不完全初始化
int arr1[3][5] = {1 , 2};
int arr2[3][5] = {0};
2.2完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
2.3按照行初始化
int arr[3][5] = {{1,2},{3,4},{4,5}};
2.4初始化时省略行,但不可以 省略列
int arr5[][5] = {1,2,3};
int arr6[][5] = {1,2,3,4,5,6,7};
int arr7[][5] = {{1,2},{3,4},{5,6}};
3.数组的使用
3.1二维数组的下标
当我们掌握了二维数组的创建和初始化,那么我们如何使用二维数组呢?
同一维数组一样,二维数组也是有下标的,二维数组是有行和列的,只要锁定了二维数组的行和列,我们就能锁定二维数组中的一个元素;
C语言规定,二维数组行是从0开始的,列是也是从0开始的;如下图所示:
左边最右侧的绿色数字表示为行号,最上面一侧的蓝色数字表示为列号,比如我们说第二行第四列就能锁定到元素7;
#include<stdio.h>
int main()
{
int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
printf("%d ",arr[2][4]);
return 0;
}
输出结果
3.2二维数组的输入和输出
我们已经知道如何访问二维数组中的一个元素了,那我们如何访问整个数组呢?
其实只要我们生成对应的行数的列数,然后遍历打印就可以了!
以上一段代码中的二维数组为例,行为0 ~ 2,列为0 ~ 4。我们可以通过如下代码来实现!
#include<stdio.h>
int main()
{
int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
scanf("%d", &arr[i][j]);
}
}
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
输出结果
二维数组在内存中的存储
和一维数组一样,我们想要研究二维数组中的元素在内存中的存储,我们需要先打印出数组所有元素的地址的;
#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个字节,所以⼆维数组中的每个元素都是连续存放的。
4.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中的变⻓数组,没法测试;
#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;
}
在gcc编译器上输出结果;
标签:初始化,arr,int,元素,C语言,二维,变长,数组 From: https://blog.csdn.net/2401_82489659/article/details/140653728