今天我们一起深入的了解以下数组
数组:相同类型元素的集合,在使用的时候,很方便,帮我们定义的时候不用S1,S2,S3.....了
目录
1. 一维数组的创建和初始化
2. 一维数组的使用
3. 一维数组在内存中的存储
4. 二维数组的创建和初始化
5. 二维数组的使用
6. 二维数组在内存中的存储
7. 数组越界
8. 数组作为函数参数
9. 数组的应用实例1:三子棋
10. 数组的应用实例2:扫雷游戏
1.一维数组的创建和初始化
1.1一维数组的创建
一维数组的创建很简单,就类似创建一个变量
int arr1[10]; //这里创建了一个int类型的数组
float arr2[10]; //这里创建了一个float类型的数组
char arr[10]; //这里创建了一个char类型的数组
上面的代码中分别创建了三个数组,大小都是10个元素
注意:数组创建的时候,[]里面必须放的是常量才可以,哪怕是counst修饰的变量也不行
1.2一维数组的初始化
一维数组的初始化有很多方式
int arr1[10]={0};
int arr2[10]={1,2,3,4,5,6,7,8,9,10};
int arr[]={1,2,3,4,5}; //这里相当于创建了一个大小为5的数组
char arr3[10]={'0'};
char arr4[10]="abcdefg";
char arr5[]={'a','b','c'}; //这里是大小为3的数组
char arr6[]="abc"; //这里是大小为4的数组,因为在输入字符串的时候还有个回
//车,字符串是一样的,后面有个结束标志/0
2.一维数组的使用
int arr[10];
int i=0;
while(i<10)
{
scanf("%d",&arr[i]);
i++;
}
这一段代码就是用循环来对数组进行赋值
注意:数组的下标是从0开始的,所以上面的赋值操作的时候,i是从0到9的
数组的大小还可以通过计算得到,比如上面代码的数组就可以用
sizeof(arr)/sizeof(arr[0])来得到,因为sizeof'的作用是求占用的字节大小,而sizeof(arr)就是求的整个数组占用的大小,上述代码就是40,用sizeof(arr[0])就是来求arr[0]占用的大小,上述数组就是4,所以40/4就是数组的大小
3.一维数组在内存中的存储
以为数组在内存中是从低地址到高地址连续存储的,可以用一段代码来看到
#include <stdio.h>
int main()
{
int arr[10] = {0};
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
for(i=0; i<sz; ++i)
{
printf("&arr[%d] = %p\n", i, &arr[i]);
}
return 0;
}
这段代码的执行结果是
这里可以明显的看出来,每个数据之间相差4,因为一个int类型数据就是占用4个字节的
4.二维数组的创建和初始化
4.1二维数组的创建
int arr[10][10];
这就是一个10行10列的二位数组
4.2二维数组的初始化
int arr1[3][3]={{1,2,3,},{4,5,6},{7,8,9}};
int arr2[3][3]={0};
int arr3[][3]={{1,2,3},{4,5,6}}; //二维数组如果有初始化,行可以省略,列不能省略
int arr4[3][3]={{1,2,3},{4,5,6}};
5.二维数组的使用
二维数组因为有行和列,所以循环的时候就需要用两个变量来进行赋值
int arr[3][3];
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
scanf("%d",&arr[i][j]);
}
}
6.二维数组在内存中的存储
和一维数组一样,二维数组在内存中也是从低地址到高地址连续存储的,用一段代码来直观的观察
#include <stdio.h>
int main()
{
int arr[3][4];
int i = 0;
for(i=0; i<3; i++)
{
int j = 0;
for(j=0; j<4; j++)
{
printf("&arr[%d][%d] = %p\n", i, j,&arr[i][j]);
}
}
return 0; }
输出的结果是这样的
这也有力的证明了我们结论的可信性
我们也可以画个图来更好的理解
这张图就清晰的讲述了二维数组在内存中的存储
7.数组越界
什么是数组越界?
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i=0; i<=10; i++)
{
printf("%d\n", arr[i]);//当i等于10的时候,越界访问了
}
return 0; }
注意:不仅仅是一维数组,二维数组的行和列都有可能越界
8.数组作为函数的参数
在我们编写一些函数的时候,往往有需要传一个数组进去的情况
#include<stdio.h>
int Add(int arr[],int len)
{
int sum=0;
for(int i=0;i<len;i++)
{
sum += arr[i];
}
return sum;
}
int main()
{
int arr[]={1,2,3,4,5};
int n,len;
len = sizeof(arr)/sizeof(arr[0]);
n=Add(arr,len);
printf("%d\n",n);
}
上述代码用一个函数来求数组中所有元素的和
为什么不在函数内部计算数组的大小呢?
答:因为数组在传参数的时候,传的是数组名,数组名本质上就是数组的首元素地址,所以传参的时候其实传的是一个地址,但是为什么通过地址就能访问到数组后面的元素了呢?,因为我们说过数组在内存是是连续存储的,所以+1的时候就访问到数组的下一个元素了.
由此可见,我们学习的知识都是一环扣一环的,所以想学习更高级的知识,必须先把我们基础打牢固了
实战项目三子棋和扫雷我后面会专门发一篇博客来给你们了解的,这里就不讲了
如果你们在学习C语言的时候有什么问题,可以私信我,我看到会回复的
祝大家开工大吉