Talk is cheap.
Show me the code.
C语言中数组的介绍
目录
1.数组的概念
2.一维数组的创建和初始化
3.一维数组的使用
4.一维数组在内存中的存储
5. 利用sizeof计算数组元素个数
6.二维数组创建和初始化
7.二维数组使用
8.二维数组在内存中的存储
1. 数组的概念
!!!数组是一组相同类型元素的集合!!!
由此可知 其中有两个关键词
一组:存放的是一个或多个数据,但是数组元素个数不能为0
相同类型元素:数组中存放的多个数据类型相同
“数组分为一维数组和二维数组,较为常见的是二维数组”
2. 一维数组的创建和初始化
2.1数组创建
基本语法
type arr_name[常量值];
type 指定的是数组中存放的数据类型
数组类型可以是:char,short, int等
arr_name 指定的是数组名的名字
数组名字尽量起的有意义,便于后续使用
[ ] 指定的是数组的大小,根据实际需求指定
例1:
存储某个班级20人的数学成绩,我们就可以创建一个数组
int math[20];
如上代码 即创建好了一个容纳20个数据的数组,名字为 math
例2:
char ch[8];
double score[10];
2.2 数组的初始化
数组的初始化分为三种
1.完全初始化
2.不完全初始化
3.错误的初始化
尤其需要提到的是不完全初始化时,剩余的元素默认初始化为0!!!
2.3 数组的类型
数组也是有类型的,数组算是一种自定义类型,去掉数组名留下的就是数组的类型。
例3:
int arr1[10];
int arr2[12];
char ch[5];
arr1数组的类型是 int [10]
arr2数组的类型是 int[12]
ch数组的类型是 char [5]
注意:数组的类型格式为 type [常量值]
不可缺少type或常量值以及中括号。
3.一维数组的使用
3.1数组下标
数组是有下标的,下标从0开始。
当数组个数有n个的时候 数组的下标从 0 —— n-1.
每个数组都有一个对应的下标,下标可用于后续的数组数据访问
在C语言中数组的访问提供了一个操作符:下标引用操作符 [ ]
例4:
#include <stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d\n",arr[7]);
printf("%d\n",arr[3]);
return 0;
}
观察上述代码,当我们想访问下标为7的元素,使用arr[7]即可,同理可得访问下标为3的元素,使用arr[3]即可。
输出结果如下
3.2数组元素打印
当我们定义完数组之后,我们可以通过printf函数进行数组打印,来查看我们初始化后的数组中是不是正确的元素。
这里需要运用到for循环,进行一个数组元素的逐个访问。
#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 ", arr[i]);
}
return 0;
}
首先初始化一个整型 i,用 i 代替数组的下标,arr[i]的意思是访问数组下标为 i 的元素,利用for循环自增 i,来满足所有数组元素的打印,即为上述代码。如下为打印结果!!!
补充:可以通过计算数组元素个数后,通过赋值变量增加上述程序的可移植性
3.3数组的输入
明白了数组的访问我们也可以试着对数组进行输入。先前在学习数据的输入与输出的时候学习了 printf和 scanf函数,scanf函数可以读取我们键盘的输入,所以我们尝试用scanf函数来进行数组元素的初始化。
由于数组元素个数并不唯一,意味着我们需要实现多组数的输入,即利用for循环进行数据的多次读写。
(在先前的课程中我们已经学习过如何使用多组数的输入,如果还不清楚的同学可以在评论区留言,如果不懂的同学多的话,博主会专门出一期教程)
#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++)
{
scanf("%d", &arr[i]);
}
//上述即为输入 下述为输出打印![请添加图片描述](https://img-blog.csdnimg.cn/66b326d6956d4e64bff07fd98fd3b9c3.png)
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
我用文字描述一下上述程序运行的过程
运行后,任意输入数字,按照0-9的下标依次存储进数组,打印时按下标依次读取打印,顺序不变。
易错点
大家很容易把arr[i]中的 i 理解为输入数组的元素,认为数组中存放的数据应为0-9九个数字,i 在此处是下标!代表每个元素的“名牌” 并不是一个存放进数组的数据
4.一维数组在内存中的存储
这个知识点只需了解即可,有助于我们了解数组的存储。
引入超纲知识: %p 代表指针,可用于访问数据地址
#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("&arr[%d] = %p\n ", i, &arr[i]);
}
return 0;
}
从输出的结果我们分析,数组随着下标的增⻓,地址是由⼩到⼤变化的,并且我们发现每两个相邻的元素之间相差4(因为⼀个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的。
补充知识:十六进制中 0-9正常用数字表示,10-15我们利用a-f进行表示,8到C(12)差4,C加4等于16 进一变为0。
5. 利用sizeof计算数组元素个数
在初期编程的时候,程序代码较简单,我们可以清晰的知道数组的元素个数,但是当后期变成代码较为复杂的时候,我们需要引用数组元素个数的时候(尤其是更改数组元素个数时),就会变得麻烦。
因此,我们可以利用一些函数来计算数组元素的个数并将他赋值给一个变量,在整个程序之中只需要引用变量即可完成相应任务。
这里,我们使用 sizeof函数,在先前的学习中我们已经得知sizeof函数可以用来测量数据所占内存大小;
对于一个数组来说,每个元素类型相同!(定义)所以所占字节相同,我们可以得出以下公式!
元素个数=数组占总字节数/每个数据占字节数
例5:
#include <stdio.h>
int main()
{
int arr1[5]={ 0,1,2,3,4,5};
sizeof(arr1);
sizeof(arr1[0]);
sz=sizeof(arr1)/sizeof(arr1[0]);
return 0;
}
如上图代码,定义数组后我们利用sizeof函数分别测定
数组的总内存,和每个元素的字节数,再用sz接受运算后的值,sz的值即为该数组的元素个数.
【在之后的编程中,只需引用变量sz则可以完成数据调用,并且在更改程序时只需更改上述代码块改变sz即可,这个操作增加了程序的可更改性和灵活性,可移植性】
6.二维数组创建和初始化
6.1二维数组概念
做一个简单的概念阐释,一维数组是以单个数据作为元素形成的数组,那么二维数组是不是也需要有数据作为元素,我们可以把一个一维数组看作一个整体(作为一个数据),那么 二维数组则是由多个一维数组构成的数组,同理,三维数组是由二维数组构成的数组。二维数组以上的数组统称多维数组。
6.2 二维数组的创建
同一维数组
type arr_name[常量值1][常量值2];
//例如:
int arr[3][5];
double data[2][8];
解释:上述代码中出现的信息
• 3表⽰数组有3⾏
• 5表⽰每⼀⾏有5个元素
• int 表⽰数组的每个元素是整型类型
• arr 是数组名,可以根据⾃⼰的需要指定名字
第一个中括号是行数,第二个中括号是列数。
6.3 二维数组初始化
同一维数组分为完全初始化,不完全初始化,按照行初始化。
不完全初始化
int arr1[3][5] = {1,2};
int arr2[3][5] = {0};!
完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
按照行初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};
每一行用大括号分隔开即可。
这里着重讲一下按照行初始化,可以省略行但是不能省略列的元素
即初始化数组时第一个括号可以不需要填写数字
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}};
7.二维数组的使用
7.1二维数组的下标
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
在了解到一维数组下标的规则后,我们可以快速地理解二维数组下标的规则。
7.2 二维数组的输入输出
如何访问整个二维数组呢?
我们只需要按一定的规律将每个元素对应的下标访问到并且打印即可。因为每个元素具有两个下标,单循环肯定是无法精确找到目标的,所以我们使用循环嵌套,定义两个代表下标的量 i 和 j 来找出每个元素的位置。
#include <stdio.h>
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
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;
}
上述代码同时包括了输入 和 输出,基本和一维数组的规律是相同的,只不过多用了一层循环,无法理解的话可以再回去看一下一维数组的输入输出。
8.二维数组在内存中的存储
像一维数组一样,我们也是可以打印出数组所有元素的地址的。
#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个字节,所以***⼆维数组中的每个元素都是连续存放的。***
以上就是我个人对C语言中数组的介绍,涵盖了一维数组和二维数组的一些基本知识,希望对大家有用!有什么问题都可以在评论区留言
希望大家点赞关注收藏!!!