Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节课开始重点给大家讲讲C语言中的数组
本套课程将会从0基础讲解C语言核心技术,适合人群:
- 大学中开设了C语言课程的同学
- 想要专升本或者考研的同学
- 想要考计算机等级证书的同学
- 想要从事C/C++/嵌入式开发的同学
================点个关注吧================
=========================================
6.4.1 数组初始化需要注意的问题
数组初始化时,可以只给部分元素赋值,当{}中的值少于元素的个数时,只给前面部分元素赋值,后面的元素会自动初始化为 0 值。
#include <stdio.h>
int main(){
//int ary[10] = {12,13,14};
//float ary[10] = {3.14,5.12};
char ary[10] = {'A','B'};
int len = sizeof(ary)/sizeof(ary[0]);
// 遍历数组
for (int i = 0; i<len; ++i)
{
// printf("ary[%d]:%d\n",i, ary[i]);
printf("ary[%d]:%c - %d\n",i, ary[i],ary[i]); //
}
return 0;
}
需要注意的问题:
- 取数组中的元素,一定要在数组下标范围内取获取,否则会取出未知区域中的数据,容易出错
- 当{}中的值的数量小于数组长度时,只给前面部分元素赋值,后面的元素会自动初始化为 0 值
-
- 对于 short,int,long 而言 0 值就是 0
- 对于 char 类型的数据来说,0 值就是空字符或者是 0
- 对于 float 和 double 类型来说,0 值就是 0.000000
6.4.2 数组元素的地址访问方式
数组名出现在表达式中,数组名代表的是数组首元素的地址,地址的占位符%p.
int ary[5] = {10,20,30,40,50};
#include <stdio.h>
int main(){
int ary[5] = {10,20,30,40,50};
printf("ary在内存中的地址:%p\n",ary );
// & 表示取值对应的内存地址
// & 叫做取址符(用来取数据在内存中的存储地址)
// &ary[0] 表示取出arr[0]这个10数据在内存中的存储地址
printf("ary[0]在内存中的地址:%p\n",&ary[0]);
// 上面两个输出结果一样,我们得出,数组名在表达式中。其实就是数组首元素的地址
return 0;
}
运行结果:
需要注意 的问题:
- ary 单独出现在表达式中,ary 就代表着数组的首元素的地址。
- ary+i 就表示将数组名从指向首元素的地址,向后移动 i 个地址,移动到下标为 i 元素的地址上。
- 所以我们可以使用元素的地址去遍历数组。
【参考代码】
#include <stdio.h>
int main(){
int ary[5] = {10,20,30,40,50};
printf("ary在内存中的地址:%p\n",ary );
// & 表示取值对应的内存地址
// & 叫做取址符(用来取数据在内存中的存储地址)
// &ary[0] 表示取出arr[0]这个10数据在内存中的存储地址
printf("ary[0]在内存中的地址:%p\n",&ary[0]);
// 上面两个输出结果一样,我们得出,数组名在表达式中。其实就是数组首元素的地址
printf("------------------------------\n");
printf("ary[1]在内中的地址:%p\n",&ary[1]);
// 使用数组名,取出第二个元素的地址
printf("ary在内存中的地址:%p\n",ary+1); // ary+1 让数组名指向第二个元素
printf("ary[2]在内中的地址:%p\n",&ary[2]);
// 使用数组名,取出第二个元素的地址
printf("ary在内存中的地址:%p\n",ary+2); // ary+2 让数组名指向第3个元素
// 通过数组名(地址)取值
// *地址 表示将地址中对应的值取出来
// * 在这个地方表示取值符,表示从某个地址空间中取出值
// *arr 表示将arr这个地址上对应的值取出来
printf("ary 当前指向的数值:%d\n",*(ary+0) );//10
printf("ary 当前指向的数值:%d\n",*(ary+1) );//20
printf("ary 当前指向的数值:%d\n",*(ary+2) );//30
printf("--------------------------------------\n");
// 使用数据名作为地址的方式,遍历数组
int len = sizeof(ary)/sizeof(int);
for (int i = 0; i < len; ++i)
{
// 1. i=0 ary+0 -> 下标为0的元素地址
// 2. i=1 ary+1 -> 下标为1的元素地址
// 3. i=2 ary+2 -> 下标为2的元素的地址
printf("ary 当前指向的数值:%d\n",*(ary+i) );// * 表示从对应地址中取出值
}
return 0;
}
6.4.3 数组排序:冒泡排序
冒泡排序的原理:
首先,第一个数和第二个数比较,如果第一个数比第二个数要大,两者交换位置,否则位置不动。然后比较第二个和第三个数,如果第二个比三个大,继续交换位置,依次往后比较
然后,经过第一轮比较,找到最大元素排到了最后。
然后每一轮按照形同的比较方式进行比较找到元素的最大值。
int a[] = {1,3,2,6,4,8,5,9,7,0};
舞动排序算法:【罗马尼亚舞团】算法的艺术 - 冒泡排序_哔哩哔哩_bilibili
分析:
n 代表数组元素的个数,i 代表比较的轮次,j 代表每一轮比较的次数
- 最坏情况下:需要比较 i=n-1 轮
- 最坏情况下:每一轮比较的次数,j = n-1-i
- 冒泡排序中,前面数据比后面的数据值要大,他们要交换位置。如何交换两个变量的值
【参考代码】
#include <stdio.h>
int main(){
int a = 20;
int b = 30;
// b=30 a=20
int temp = 0;// 中间盘子
// 将a的值保存到中间盘子
temp = a;
// 将b的值保存到a中
a = b;
// 再将中间盘子中,保存的a的值存入到b中
b = temp;
printf("a=%d ,b=%d\n", a,b);
return 0;
}
尝试自己编写一下冒泡排序的代码:
提示:使用双重 for 循环,外层循环 i 表示比较的轮次,内层循环 j 表示每轮 比较的次数。
【参考代码】
#include <stdio.h>
int main(){
int n = 0;
printf("请输入数据个数:");
scanf("%d",&n);
// 用输入的个数,构建数组
int ary[n];
for (int i = 0; i < n; ++i)
{
printf("请输入%d个数据:", (i+1));
scanf("%d",&ary[i]);
}
// 冒泡排序
// 最外层的循环,比较轮次:最多比较n-1轮 (循环n-1)
for (int i = 0; i < n-1; ++i) // i表示第几轮
{
//内层循环,代表着每一轮比较的次数:最多比较的n-1-i次
for (int j = 0; j < n-1-i; ++j) // j表示比较的第几次
{
// 前后进行比较,如果前面一个数比后面一个数大
// 就交换位置
if(ary[j]>ary[j+1]){
int temp = ary[j];
ary[j] = ary[j+1];
ary[j+1] = temp;
}
}
}
// 遍历测试排序结果
for (int i = 0; i < n; ++i)
{
printf("%d\t", ary[i]);
}
printf("\n");
return 0;
}
当下排序方式是按照从小到大排序的,如果需要从大到小排,只需要将程序中的 ary[j]>ary[j+1] 修改成 ary[j]<ary[j+1] 即可。
----------------------------------------------------------------------
分享不易,耗时耗力,喜欢的同学给个关注和赞吧
承接毕设指导,技术答疑,学习路上想要找私人教练的同学可以私信我
更多学习资料,公众号:墨轩学习网,B站:墨轩大楼
----------------------------------------------------------------------
另有下图需求的也记得私信我哟,专业班子