【C语言从不挂科到高绩点】10-C语言中数组 01

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节课开始重点给大家讲讲C语言中的数组

本套课程将会从0基础讲解C语言核心技术,适合人群:

  1. 大学中开设了C语言课程的同学
  2. 想要专升本或者考研的同学
  3. 想要考计算机等级证书的同学
  4. 想要从事C/C++/嵌入式开发的同学

================点个关注吧================

=========================================

六、C 语言中的数组

6.1 数组的概述

之前定义的变量在内存中只开辟了一个空间,只能存放一个数据,如果存放多个数据的话,之前的写法就实现不了了,这个时候就需要用到数组。

int ary[4];

上面的代码中,会在内存中分配 4 个连续的 int 类型空间。共占用 4*4=16 个字节。针对这 4 个 int 类型的空间整体取了个名叫 ary。我们将这样连续的内存空间存储一组数据集合叫做数组。

数据集合的名称称为数组名。数据集合中包含的每一个数据叫做数组的元素。数组中包含的数据个数称为数组的长度

上面代码转换成图显示:

上面的数组中:ary 数组名,20、10、30、50 这些数据称为数组的元素。数组中存放 4 个元素,那么这个数组的长度就为 4.

需要注意的问题:

  1. 数组是多个类型相同元素组成的一个数据集合。相当于一次性定义了多个类型相同的变量,将其存储到了一片连续的内存空间
  2. 数组的类型:数组中元素的数据类型,如果数组的类型是 int 类型,那么就意味着这个数组中只能存放 int 类型的数据。
  3. 数组的元素:每个位置上存放的数据内容。
  4. 数组的长度:数组中元素的实际个数。
  5. 数组占用内存的大小:连续的内存占用的字节=数组的长度*数组元素类型占用的字节。
  6. 数组的下标:开辟出来的连续空间,每个整体空间都有一个编号,这个编号称为下标。可以根据下标去访问或者操作数组中的元素(下标从 0 开始)。

6.2 数组的定义

6.2.1 定义数组的格式

数据类型 数组名 [ 数组的长度 ];

比如:

int ary[5];
  1. ary 是数组名,就是为数组开辟出的连续空间的名称。单独出现在表达式中代表的是数组首元素的地址
  2. [5] 代表着这片连续的空间共分为 5 个等份的格子,每个格子中存储的数据称为数组的元素。
  3. int 代表了每个元素的类型。可以是任意类型,也可以是组类型,也可以是数组。但是一旦确定好类型之后,数组中只能存放此种类型的数据。
  4. 数组在定义的时候可以直接进行初始化赋值,成为初始值。

6.2.2 定义数组的方式

  1. 定长数组:在定义的时候直接确定数组的个数
int arr[5];// 该数组拥有5个int类型连续内存空间
  1. 变长数组:在定义的时候,通过输入或者赋值去确定数组的长度
int n=5;
int ary[n];

windows 下,有的编译器不能使用这种变长的手段定义数组

  1. 柔性数组:在定义的时候,根据赋值列表判断空间大小并赋值
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 数组的初始化方式

  1. 清空每个单元的存储,将所有的元素赋值为 0
int a[10] = {0};
double da[10] = {0};
char ca[10] = {0};

表示:将数组的 10 个元素,全部初始化为 0;

  1. 根据空间大小,准备合法的数据进行对位赋值。
int a[5] = {2,5,6,7,4};

  1. 根据空间的区间定位,然后选择某片空间进行连续赋值
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 个学生录入成绩

  1. 求出班级的总分
  2. 求出班级的平均分
  3. 求出班级的最高分和最低分

【参考代码】

/**
设班上有 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站:墨轩大楼

----------------------------------------------------------------------

另有下图需求的也记得私信我哟,专业班子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听潮阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值