C语言.(二)二维数组的基本语法

1. 二维数组的创建

1.1 二维数组的概念

上一节学习的数组被称为一维数组,数组的元素都是内置类型的,如果把一维数组作为数组的元素,这时候就是二维数组

在这里插入图片描述

1.2 二维数组的创建

二维数组的语法如下:

type arr_name[常量值1][常量值2];

例如:
int arr[3][5];
double date[2][8];

上述代码出现的信息 :
(1) 3 表示有3行
(2) 5 表示每一行有5个元素
(3) int 表示数组的每一个元素的类型是整型类型
(4) arr 是数组名,可以根据自己的需求指定名字
date 数组意思基本一致

2. 二维数组的初始化

在创建变量或者数组的时候,给定⼀些初始值,被称为初始化。

2.1 不完全初始化

int arr1 [3][5] = {1,2};
int arr2 [3][5] = {0};

在这里插入图片描述

2.2 完全初始化

int arr[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};

在这里插入图片描述

2.3 按照行初始化

int arr4[3][5] = { {1,2},{3,4},{5,6} };

在这里插入图片描述

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 开始的,如下:

int arr[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};

在这里插入图片描述
图中最左的黑色数字表示行号,最上边的黑色数字表示列号,都是从 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\n",arr[2][4]);
	return 0;
}

结果如下:
在这里插入图片描述

3.2 二维数组的输入和输出

其实我们只要能够按照一定的规律产产所有的行和列的数字就行;

以上一段代码中的 arr 数组为例,行的选择范围是 0到2列的取值范围是0到4所以我们可以借助循环实现生成所有的下标

#include <stdio.h>
int main()
{
	int arr[3][5] = { 0 };//数组的不完全初始化
	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;
}

输入和输出的结果:
在这里插入图片描述

4. 二维数组在内存中的存储

像一维数组一样,我们如果想研究二维数组在内存中的存储方式,我们也是可以打印出数组所有元素的地址的。
代码如下:

#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]);//%p 是打印地址的
		}
	}
	return 0;
}

输出的结果是:
在这里插入图片描述
插个知识点:
十六进制的 10~16 的数字用 A~F 字母(大小写到可以)来表示
从输出的结果来看,每一行内部的每一个元素都是相邻的,地址之间相差 4 个字符;
跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差了 4 个字节。
结论是:二维数组中的每个元素都是连续存放的
在这里插入图片描述

5. 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 中的变长数组

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值