文章目录
- 6. 二维数组的创建
- 6.1 ⼆维数组的概念
- 6.2 ⼆维数组的创建
- 7. 二维数组的初始化
- 7.1 不完全初始化
- 7.2 完全初始化
- 7.3 按照⾏初始化
- 7.4 初始化时省略⾏,但是不能省略列
- 8. 二维数组的使用
- 8.1 ⼆维数组的下标
- 8.2 ⼆维数组的输⼊和输出
- 9. 二维数组在内存中的存储
- 10. C99中的变长数组
- 11. 数组练习
6. 二维数组的创建
6.1 ⼆维数组的概念
如果我们把一维数组做为数组的元素,这时候就是二维数组。二维数组以上的数组统称为多维数组。
也就是说可以理解成二维数组就是由多行一维数组组成的。
6.2 ⼆维数组的创建
二维数组语法:
type arr_name[常量值1][常量值2];
举个例子:
int arr[3][5];
3表示数组有3行
5表示每一行有5个元素,也可以理解成5列
int 表示数组的每个元素是整型类型
arr 是数组名,可以根据自己的需要指定名字
7. 二维数组的初始化
7.1 不完全初始化
int arr1[3][5] = {1,2};
int arr2[3][5] = {0};
7.2 完全初始化
int arr3[3][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
7.3 按照⾏初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};
7.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}};
8. 二维数组的使用
8.1 ⼆维数组的下标
二维数组是有行和列的,只要锁定了行和列就能唯一锁定数组中的元素.
第一行蓝色的数字表示列号,第一列蓝色数字表示行号。
都是从0开始的。
arr[0][0]
=1
arr[1][2]
=8
8.2 ⼆维数组的输⼊和输出
如何访问整个二维数组?
#include <stdio.h>
int main()
{
int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
int i = 0;
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] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
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;
}
打印:
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标准中给一个变长数组的新特性,允许我们可以使用变量指定数组大小。
int n = a+b;
int arr[n];
这个例子里面,数组 arr 就是变长数组,因为它的长度取决于变量 n 的值,编译器没法事先确定,只有运行时才能知道 n 是多少。
变长数组的数组长度只有运行时才能确定,所以变长数组不能初始化。
注意:有些编译器不支持C99语法,所以使用变长数组有时会报错。
11. 数组练习
编写代码,演示多个字符从两端移动,向中间汇聚:
#include <stdio.h>
int main()
{
char arr1[] = "welcome to bit...";
char arr2[] = "#################";
int left = 0;
int right = strlen(arr1)-1;//得到数组元素个数减一,用作数组最右边一个元素
printf("%s\n", arr2);
while(left<=right)
{
Sleep(1000);//延时1秒,这个函数只有Windows电脑可以用
//这个延时函数可以让下面的打印慢慢出来,比较好玩
arr2[left] = arr1[left];
arr2[right] = arr1[right];
//将arr1中的字符赋值给arr2中的对应位置。这样arr2中的井号被arr1中的字符替换。
left++;
right--;
//left++;和right--;分别将left和right向中间移动,left 向右移动,right向左移动。
printf("%s\n", arr2);
}
return 0;
}
打印: