本章重点
- 一维数组的创建和初始化
- 一维数组的使用
- 一维数组在内存中的存储
- 二维数组的创建和初始化
- 二维数组的使用
- 二维数组在内存中的存储
- 数组作为函数参数
- 数组的应用实例1:三子棋
- 数组的应用实例2:扫雷游戏
一、一维数组的创建和初始化
1.数组的创建
数组是一组相同类型元素的集合。数组的创建方式:
type_t arr_name [const_n]
//type_t 是指数组的元素类型
//const_n 是一个常量表达式(不能用变量),用来指定数组的大小
//(注意:数组的大小是指元素的个数,元素的个数要比下标大1)
注:C99语法支持变长数组(即数组的大小是变量),但VS2022不支持变长数组
2.数组的初始化
数组的初始化是指,在创建数组的同时给数组的内容一些初始值
int arr1[5]={
1,2,3,4,5};//完全初始化
int arr2[5]={
1};//不完全初始化
//下面两种初始化等价
int arr3[ ]={
1,2,3};
int arr3[3]={
1,2,3};
//字符数组初始化
char ch1[5]={
'b','i','t'};//其实里面存放的是b i t \0 \0
char ch2[ ]={
'b','i','t'};//里面存放的是b i t
char ch3[5]="bit";//其实里面存放的是b i t \0 \0
char ch4[ ]="bit";//其实里面存放的是b i t \0
数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。但是对于上面的单引号和双引号要区分内存中如何分配。
char ch2[ ]={
'b','i','t'};//里面存放的是b i t
char ch4[ ]="bit";//其实里面存放的是b i t \0
printf("%s\n",ch2);
printf("%s\n",ch4);
//输出结果:
//bit乱码乱码乱码
//bit
//因为输出是遇到\0才会停止的,而数组ch2没有\0,所以会有乱码输出
二、 一维数组的使用
对于数组的使用我们之前介绍了一个操作符:[ ],下标引用操作符。它其实就数组访问的操作符。我们来看代码:
#include <stdio.h>
int main()
{
int arr[10]={
0};//注意这里是定义了10个元素
arr[4]=5;//[ ] 是下标引用操作符。
//注意,这里的[4]是第5个元素,下标是4,而初始化的[10]是10个元素
}
#include <stdio.h>
int main()
{
int arr[10] = {
0 };//数组的不完全初始化
//计算元素个数
int sz = sizeof(arr) / sizeof(arr[0]);
//对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
int i = 0;//做下标
for (i = 0;i < 10;i++)
{
arr[i] = i;
}
//输出数组的内容
for (i = 0;i < 10;i++)
{
printf("%d ", arr[i]);
}
return 0;
}
总结:
- 数组是使用下标来访问的,下标是从0开始。
- 数组的大小可以通过计算得到。
int arr[10] = {
0 };
int sz = sizeof(arr) / sizeof(arr[0]);
三、 一维数组在内存中的存储
//%p - 是按地址的格式打印 - 十六进制的打印
//%x - 打印十六进制数
int main()
{
//printf("%x\n", 284);//输出结果:11c
//printf("%p\n", 284);//输出结果:0000011C(32位平台有8位,64位平台有16位)
//解释为什么是8位:一个字节8比特位,也就是8个二进制位。四个二进制最大表示为15,就是一个16进制数,所以8位可以表示成2个16进制的数
// 所以这么理解:一个字节表示8个二进制位,表示2个16进制位
int arr[10] = {
0 };
int i = 0;
for (i = 0;i < 10;i++)
{
printf("%p\n", &arr[i]);
}
return 0;
}
输出结果:
总结:
- 一维数组在内存中是连续存放的!
- 随着数组下标的增长,地址是由低到高变化的!
- 数组名是数组首元素的地址
int main()
{
int arr[10] = {
1,2,3,4,5,6,7,8,9,10};
int* p = arr;//数组名是数组首元素的地址
int i = 0;
for (i = 0;i < 10;i++)
{
printf("%d ", *p);//一维数组在内存中是**连续存放**的
p++;//所以每++一次,就能得到下一个元素的地址
}
return 0;
}
//输出结果:1 2 3 4 5 6 7 8 9 10
四、 二维数组的创建和初始化
1.二维数组的创建
//数组创建
int arr[3] [4];//3行4列,int类型
char arr[3] [4];//3行4列,char类型
double arr[2] [4];//2行4列,double类型
2.二维数组的初始化
//数组初始化-创建的同时给赋值
int arr[3] [4] = {
1,2,3,4,5,6,7,8,9,10,11,12};
//内存中的存放情况是:
//1列 2列 3列 4列
//1行 1 2 3 4
//2行 5 6 7 8
//3行 9 10 11 12
int arr[3] [4] = {
1,2,3,4,5,6,7};//不完全初始化,后面补0(char类型补\0)
//内存中的存放情况是:
//1列 2列 3列 4列
//1行 1 2 3 4
//2行 5 6 7 0
//3行 0 0 0 0
int arr[3] [4] = {
{
1,2}, {
3,4}, {
4,5} };
//内存中的存放情况是:
//1列 2列 3列 4列
//1行 1 2 0 0
//2行 3 4 0 0
//3行 4 5 0 0
int arr[ ] [4]= {
{
1,2}, {
3,4}, {
4,5} };//二维数组行可以省略,但是列不能省略
//内存中的存放情况是:
//0列 1列 2列 3列
//0行 1 2 0 0
//1行 3 4 0 0
//2行 4 5 0 0
3. 总结
- arr[3] [4],第一个[ ] 是行,第二个是列,行可以省略,列不可以省略
- 不完全初始化,后面补0
- 在创建的时候,[ ]里面的数字是规定几行几列,写几就是几;在使用的时候,是从0开始的
五、二维数组的使用
使用的时候,行号和列号都是从0开始的
int main()
{
int arr[3][4] = {
{
1,2}, {
3,4}, {
4,5} };
int i = 0, j = 0;
for (i = 0;i < 3;i++)
{
for (j = 0;j < 4;j++)
{
printf("%d ",arr