❣博主主页: 33的博客❣
▶文章专栏分类: C语言从入门到精通◀
🚚我的代码仓库: 33的代码仓库🚚
目录
- 1. 前言
- 2.一维数组的概念
- 3.一维数组的创建和初始化
- 3.1数组的创建
- 3.2数组的初始化
- 3.3数组的类型
- 4.一维数组的使用
- 4.1数组下标
- 4.2数组元素打印
- 4.4数组元素输入
- 5. 一维数组在内存中的存储
- 6.sizeof求数组个数
- 7.二维数组
- 7.1 二维数组的创建
- 7.2二维数组初始化
- 8.二维数组的使用
- 8.1二维数组的下标
- 8.2 二维数组的打印
- 8.3 二维数组的输入
- 8.4二维数组在内存中的存储
- 9. 总结
1. 前言
前面我们已经学习了分支和循环,这篇文章我们一起来学习新的知识—数组,数组是一个十分常见的知识,接下来就一起进入数组的学习吧!
本章重点
本篇文章主要介绍数组的概念,一维数组的创建的初始化,一维数组的使用,一维数组在内存中的存储,二维数组的创建和初始化,二维数组的使用等等。
2.一维数组的概念
数组是一组相同类型元素的集合:
数组中存放的是一个或者多个数据,但数组元素不能为0,
数组中存放的多个数据,类型是相同的
3.一维数组的创建和初始化
3.1数组的创建
格式如下:
type arr_name[常量值];
type是指数组的类型,可以是:char、short、int等等。
arr_name是数组名,自定义。
[常量值] 常量值是用来定义数组的大小,自定义。
例如
int a[3];//定义了一个数组a长度为3
3.2数组的初始化
数组在创建的时候,我们需要得定义一些初始值,这种就称为数组的初始化。
那么数组该如何初始化呢?数组的初始化一般用大括号,将数据放在大括号内。数组的初始化又可以分为完全初始化和不完全初始化。
例如:
//完全初始化
int a[3]={1,2,3}
//不完全初始化
int a[5]={1}//第一个元素为初始化为1,其余默认初始化为0
3.3数组的类型
数组也是有类型的,数组算是一种自定义类型,去掉数组名留下的就是数组类型
int a[3]={1}
char b[4]={'1'}
数组a的类型是int [3]
数组b的类型是char [4]
4.一维数组的使用
4.1数组下标
c语言中,数组下标是从0开始,假设数组的长度是n,那么数组的下标最大就是n-1.第1个数组元素可以写为a[0],第2个数组元素可以写为a[1],第3个数组元素可以写为a[2]…那么第n个数组元素就可以写为a[n-1]。
4.2数组元素打印
如果要访问整个数组,该如何打印呢?接下来我们通过一段程序来实现
int main()
{
int arr[3]={1,2,3};
int i=0;
for(i=0;i<3;i++)
{
printf("%d",arr[i]);
}
}
4.4数组元素输入
如果要从键盘中输入一个元素,存入数组中,那么又该如何实现呢?
int main()
{
int arr[3]={0};//默认初始化为0
int i=0;
for(i=0;i<3;i++)
{
scanf("%d",&arr[i]);//从键盘中输入一个元素,存入数组arr中
}
}
5. 一维数组在内存中的存储
我们如果想要知道数组在内存中是如何存取的,我们可以通过打印数组中每个元素的地址来看看规律。
int main()
{
int arr[6] = { 1,2,3,4,5,6};
int i = 0;
for (i = 0; i < 6; i++)
{
printf("arr[%d]的地址=%p\n",i, &arr[i]);
}
}
运行结果:
我们会发现a[0]到a[5]的地址依次增大,并且相邻两个数组元素相差4个字节,为什么是4个字节呢那是因为我们定义的元素类型为int类型,int类型的大小就是4个字节。我们就可以得出结论:数组在内存中是连续存放的,且随着下标的增大,数组地址也增大。
6.sizeof求数组个数
在遍历数组的时候,我们经常想知道数组的个数,就可以sizeof操作符来求。
例如:
int main()
{
int arr[8] = {0};
printf("%d", sizeof(arr));
}
结果:
个数应该是8个为什么返回32呢?其实是因为***sizeof计算的是数组所栈内存空间的总大小,单位为字节。***如果要计算数组的个数,只需要用 总内存空间/一个元素的内存
int main()
{
int arr[8] = {0};
printf("%d", sizeof(arr)/sizeof(arr[0]));
}
结果:
输出结果为8个
7.二维数组
概率:把一维数组作为数组的元素,那么就是二维数组。
7.1 二维数组的创建
定义二维数组格式如下:
type arr_name[常量值1][常量值2];
//例如
int a[3][5];//定义三行5列的数组
7.2二维数组初始化
例如
int arr1[2][3]={1,2,3,4,5,6};//完全初始化
int arr2[2][3]={1,2,3};//不完全初始化,其他值默认为0
int arr3[2][3]={{1,2,3},{4,5,6}};//按照行初始化
int arr4[][3]={1,2,3,4};//初始化的时候行可以省略,但是列一定不能省!!
8.二维数组的使用
8.1二维数组的下标
一维数组的访问需要下标,其实二维数组的访问也需要下标,二维数组是有行有列的,只要确定了行列就可以访问了。
int arr[2][3]={1,2,3,4,5,6};
如下图:
我们可以用arr[1][2]来表示6,我们可以用arr[][1]来表示2
8.2 二维数组的打印
int main()
{
int arr[2][3]={1,2,3,4,5};
int i = 0;
int j = 0;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
8.3 二维数组的输入
前面我们已经学习了一维数组的输入,那么二维数组该怎么输入呢?其实和一维数组很类似。
如下:
int main()
{
int arr[2][3]={0};
int i = 0;
int j = 0;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
scanf("%d ",&arr[i][j]);
}
return 0;
}
}
8.4二维数组在内存中的存储
在上述内容中我们已经得出结论:一维数组在内存中是连续存放的,且随着下标的增大,数组地址也增大,那二维数组是否也存在这样的规律呢?
我们来进行验证:
int main()
{
int arr[2][3] = { 1,2,3,4,5 };
int i = 0;
int j = 0;
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
printf("arr[%d][%d] = %p\n", i,j,&arr[i][j]);
}
}
return 0;
}
结果如下:
我们发现和一维数组一样,二维数组在内存中是连续存放的,且随着下标的增大,数组地址也增大。
9. 总结
本篇文章主要介绍数组的概念,一维数组的创建的初始化,一维数组的使用,一维数组在内存中的存储,二维数组的创建和初始化,二维数组的使用,有想法的同学可以通过本篇文章的知识来完成二分查找,两边向中间输入等关于c语言的学习博主就先告一段了,接下来将进行java的学习,如果同学们想继续深入学习,可以去看看其他博主的文章。