Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节课开始重点给大家讲讲C语言中的数组
本套课程将会从0基础讲解C语言核心技术,适合人群:
- 大学中开设了C语言课程的同学
- 想要专升本或者考研的同学
- 想要考计算机等级证书的同学
- 想要从事C/C++/嵌入式开发的同学
================点个关注吧================
=========================================
六、C 语言中的数组
6.1 数组的概述
之前定义的变量在内存中只开辟了一个空间,只能存放一个数据,如果存放多个数据的话,之前的写法就实现不了了,这个时候就需要用到数组。
int ary[4];
上面的代码中,会在内存中分配 4 个连续的 int 类型空间。共占用 4*4=16 个字节。针对这 4 个 int 类型的空间整体取了个名叫 ary。我们将这样连续的内存空间存储一组数据集合叫做数组。
数据集合的名称称为数组名。数据集合中包含的每一个数据叫做数组的元素。数组中包含的数据个数称为数组的长度。
上面代码转换成图显示:
上面的数组中:ary 数组名,20、10、30、50 这些数据称为数组的元素。数组中存放 4 个元素,那么这个数组的长度就为 4.
需要注意的问题:
- 数组是多个类型相同元素组成的一个数据集合。相当于一次性定义了多个类型相同的变量,将其存储到了一片连续的内存空间。
- 数组的类型:数组中元素的数据类型,如果数组的类型是 int 类型,那么就意味着这个数组中只能存放 int 类型的数据。
- 数组的元素:每个位置上存放的数据内容。
- 数组的长度:数组中元素的实际个数。
- 数组占用内存的大小:连续的内存占用的字节=数组的长度*数组元素类型占用的字节。
- 数组的下标:开辟出来的连续空间,每个整体空间都有一个编号,这个编号称为下标。可以根据下标去访问或者操作数组中的元素(下标从 0 开始)。
6.2 数组的定义
6.2.1 定义数组的格式
数据类型 数组名 [ 数组的长度 ];
比如:
int ary[5];
- ary 是数组名,就是为数组开辟出的连续空间的名称。单独出现在表达式中代表的是数组首元素的地址。
- [5] 代表着这片连续的空间共分为 5 个等份的格子,每个格子中存储的数据称为数组的元素。
- int 代表了每个元素的类型。可以是任意类型,也可以是组类型,也可以是数组。但是一旦确定好类型之后,数组中只能存放此种类型的数据。
- 数组在定义的时候可以直接进行初始化赋值,成为初始值。
6.2.2 定义数组的方式
- 定长数组:在定义的时候直接确定数组的个数
int arr[5];// 该数组拥有5个int类型连续内存空间
- 变长数组:在定义的时候,通过输入或者赋值去确定数组的长度
int n=5;
int ary[n];
在 windows 下,有的编译器不能使用这种变长的手段定义数组。
- 柔性数组:在定义的时候,根据赋值列表判断空间大小并赋值
int a[] = {100,200,300,400};// 表示:在大括号中给了4个数据,那么数组的长度就为4
【演示案例】
#include <stdio.h>
int main(){
// 定义定长数组
int arr[5];
printf("arr占用的内存大小为:%ld\n", sizeof(arr));
// 数组占用内存大小=元素类型空间大小*数组的长度
printf("arr占用的内存大小为:%ld\n",sizeof(int)*5);
// arr[0] 获取数组下标为0 的元素(首元素)
printf("arr数组中元素占用的字节数:%ld\n",sizeof(arr[0]));
printf("arr数组中元素类型的字节数:%ld\n",sizeof(int));
// 定义变长数组
int n=0;
printf("请输入数组的长度:");
scanf("%d",&n);
int ary[n];// 使用变量n作为数组的长度
printf("ary占用的内存大小为:%ld\n",sizeof(ary));
// 定义柔性数组
int a[] = {10,20,30,40,10,70,89,56,8};
printf("a占用的内存大小为:%ld\n",sizeof(a));
// 求数组的长度
// 数组占用的总空间大小/每个元素占用的空间大小
printf("数组的长度:%ld\n", (sizeof(a)/sizeof(int)));
printf("数组的长度:%ld\n", (sizeof(a)/sizeof(a[0])));
return 0;
}
6.2.3 数组的初始化方式
- 清空每个单元的存储,将所有的元素赋值为 0
int a[10] = {0};
double da[10] = {0};
char ca[10] = {0};
表示:将数组的 10 个元素,全部初始化为 0;
- 根据空间大小,准备合法的数据进行对位赋值。
int a[5] = {2,5,6,7,4};
- 根据空间的区间定位,然后选择某片空间进行连续赋值
int ba[100]={[0 ... 30]=10, [31 ... 60]=20, [61 ... 99]=30};
表示:数组的下标 0 到 30 的元素赋值为 10,下标为 31 到 60 的元素赋值为 20,下标为 61 到 99 的元素赋值为 30.
【演示案例】
#include <stdio.h>
int main(){
int a[5] = {0}; // 将所有的元素初始化为0
int ary[5] = {50,80,70,20,10};
// 下标 0到30设置为10 31到50初始化为20 51到99初始化为30
int ba[100] = {[0 ... 30]=10,[31 ... 50]=20,[51 ... 99]=30};
return 0;
}
6.3 数组的取值和遍历
6.3.1 获取数组元素的方式
数组名[下标];
假如:
int ary[5] = {10,30,20,80,60}
数组在内存中的存储,可以是如下的形式:
如上图所示:
// 获取数组指定位置上元素的方式: 数组名[下标];
ary[0] // 将数组下标为0 的元素取出来
ary[2] // 将数组下标为2 的元素取出来
【演示案例】
#include <stdio.h>
int main(){
int a[5] = {0}; // 将所有的元素初始化为0
// 数组的下标(元素的位置)从0开始
// 下标: 0 1 2 3 4
int ary[5] = {50,80,70,20,10};
// 下标 0到30设置为10 31到50初始化为20 51到99初始化为30
int ba[100] = {[0 ... 30]=10,[31 ... 50]=20,[51 ... 99]=30};
// 从数组中获取元素的格式: 数组名[下标]
printf("ary[0]:%d\n",ary[0]); // 获取数组中下标为0的元素
printf("ary[1]:%d\n",ary[1]); // 获取数组中下标为1的元素
printf("ary[2]:%d\n",ary[2]); // 获取数组中下标为2的元素
printf("ary[3]:%d\n",ary[3]); // 获取数组中下标为3的元素
printf("ary[4]:%d\n",ary[4]); // 获取数组中下标为4的元素
return 0;
}
6.3.2 数组的遍历
数组的遍历:逐个访问从下标为 0 的数据到最后一个数据
// 下标: 0 1 2 3 4
int ary[5] = {50,80,70,20,10};
遍历数组的固定格式:
int 数组长度 = sizeof(数组名称)/sizeof(数组类型);
for(int i=0;i<数组长度;i++){
// 获取数组中的数据
数组名[i];// 将i看成数组的下标
}
【案例代码】
#include <stdio.h>
int main(){
int a[5] = {0}; // 将所有的元素初始化为0
// 数组的下标(元素的位置)从0开始
// 下标: 0 1 2 3 4 5
int ary[7] = {50,80,70,20,10,30,90};
// 下标 0到30设置为10 31到50初始化为20 51到99初始化为30
int ba[100] = {[0 ... 30]=10,[31 ... 50]=20,[51 ... 99]=30};
// 从数组中获取元素的格式: 数组名[下标]
printf("ary[0]:%d\n",ary[0]); // 获取数组中下标为0的元素
printf("ary[1]:%d\n",ary[1]); // 获取数组中下标为1的元素
printf("ary[2]:%d\n",ary[2]); // 获取数组中下标为2的元素
printf("ary[3]:%d\n",ary[3]); // 获取数组中下标为3的元素
printf("ary[4]:%d\n",ary[4]); // 获取数组中下标为4的元素
// 数组的第一个元素:
printf("ary[0]:%d\n", ary[0]);
// 数组的最后一个元素: 直到数组有6个元素,长度为6
printf("ary[5]:%d\n", ary[5]);
// 很多情况下,我们在操作数组的时候,并不知道数组有多少个元素(数组的长度)
// 此种情况可以算出数组长度
// 数组长度=sizeof(数组名)/sizof(数组类型);
// 数组长度=sizeof(数组名)/sizof(数组首元素);
// int len = sizeof(ary)/sizeof(int);
int len = sizeof(ary)/sizeof(ary[0]);
// 数组最后一个元素的下标:len-1
printf("ary最后一个元素:%d\n", ary[len-1]);
printf("----------------------\n");
// 数组的遍历:就是写个for循环,让i从下标从0开始到数组的最后一个元素的下标结束
for(int i=0;i<=5;i++){ // i 可以从0 取到4
printf("ary[%d]:%d\n",i,ary[i]);
}
printf("------------------------\n");
// 数组遍历的固定格式:
// 1. 计算出数组的长度:数组长度=sizeof(数组名)/sizof(数组类型);
len = sizeof(ary)/sizeof(int);
// 2. 写一个for循环,让i作为数组的下标,从0到数组长度逐一递增
for(int i=0;i<len;i++){
// 3. 在for循环中根据i从数组中获取元素
printf("ary[%d]:%d\n",i,ary[i]);
}
return 0;
}
练习:遍历如下 数组
int ba[100] = {[0 ... 30]=10,[31 ... 50]=20,[51 ... 99]=30};
6.3.3 修改或者设置数组元素的值
数组名[下标] = 值;
比如:
// 下标: 0 1 2 3 4 5
int ary[7] = {50,80,70,20,10,30,90};
//将 70 修改为666
ary[2] = 666;
【演示案例】
printf("---------------------------\n");
ary[2] = 666;// 将下标为2的元素设置为666
// 数组遍历的固定格式:
// 1. 计算出数组的长度:数组长度=sizeof(数组名)/sizof(数组类型);
len = sizeof(ary)/sizeof(int);
// 2. 写一个for循环,让i作为数组的下标,从0到数组长度逐一递增
for(int i=0;i<len;i++){
// 3. 在for循环中根据i从数组中获取元素
printf("ary[%d]:%d\n",i,ary[i]);
}
6.3.4 数组练习-成绩管理
设班上有 5 个学生,分别给 5 个学生录入成绩
- 求出班级的总分
- 求出班级的平均分
- 求出班级的最高分和最低分
【参考代码】
/**
设班上有 5 个学生,分别给 5 个学生录入成绩
1. 求出班级的总分
2. 求出班级的平均分
3. 求出班级的最高分和最低分
**/
#include <stdio.h>
int main(){
int num = 0;// 输入班级的人数
printf("请输入班级的人数:");
scanf("%d",&num);
// 定义数组,用来存放所有学生的成绩
//float ssx[5] = {0} ;
float scores[num] ;
float sum = 0;// 总分
for (int i = 0; i < num; ++i)
{
printf("请输入第%d位同学的成绩:\n",(i+1));
// float sc = 0;
// scanf("%f",&sc);
// scores[i] = sc; // 将输入的分数存入到数组中
// 直接向数组中录入数据
// 第一次循环:&score[0] 将录入的数据,存入首元素所对应的空间
// 第二次循环:&score[1] 将录入的数据,存入到下标为1的所对应的空间
scanf("%f",&scores[i]);
// 每录入一个成绩,就将成绩累加到sum总分中
sum += scores[i]; // 将录入的成绩取出来,累加到总分中
}
printf("班级的总分为%.1f,平均分为:%.1f\n",sum ,sum/num);
// 假设第一个学生的成绩是最高分
float max = scores[0];
// 假设第一个学生的成绩是最低分
float min = scores[0];
// 遍历数组,和这个假设的最高分做比较
for(int i=0;i<num;i++){
// 如果当前的分数大于假设的最高分
if(max<scores[i]){ //说明假设错误
// 重新假设当前的分数为最高分
max = scores[i];
}
if(min>scores[i]){
min = scores[i];
}
}
printf("班级的最高分为:%f\n", max);
printf("班级的最低分为:%f\n", min);
return 0;
}
----------------------------------------------------------------------
分享不易,耗时耗力,喜欢的同学给个关注和赞吧
承接毕设指导,技术答疑,学习路上想要找私人教练的同学可以私信我
更多学习资料,公众号:墨轩学习网,B站:墨轩大楼
----------------------------------------------------------------------
另有下图需求的也记得私信我哟,专业班子