一、数组解析
1. 顺接基础与引入
在此前的程序中,所使用的变量均为标量类型(即基本类型)的变量。
然而,当一个程序需要存储批量数据时,使用标量类型的变量甚为不便。
此时,可以使用一种组合类型的数据数组。
总结一下就是因为定义一堆变量太麻烦人了,还不便于管理,就像公布成绩的时候一个同学一张成绩单,老师折腾也费劲,所以想办法整合一下,同类型的整理在一起,全班人的成绩整理成一张表格,也就是一个集合体,所以在程序中也得想办法把同类型的变量整合在一起,不过这个集合体不叫表格,叫数组
2. 数组简介
所谓数组,是一组有序变量的集合,而且这些变量具有相同的数据类型
(你把A同学学号跟B同学身份证号混在一个统计学号的表格里不行吧,人家就是int型的,你非得给人家塞进去个float型的也说不太过去吧)
数组中的变量称为数组元素
别管有没有赋值,一个表格我列了几行就是几行,不管我有没有写东西,所以元素不管有没有赋值,我定义了几个就是几个
比如这里就是6个元素,虽然我只赋值了三个元素
而且这种定义的时候就赋初值的,数组里其他的未赋值元素都是0。这种赋值方法还是蛮重要的,毕竟有随机值做题的时候可能会出错。
数组元素的个数称为数组长度
数组中最常用的是一维数组
二、一维数组
一维数组中的所有元素可以看作一行。
一维数组的每个元素只需要一个序号(也称为下标)。
一维数组就一行想用别的区分你也没机会啊
在程序中使用数组时,必须先定义后使用。
1.一维数组格式:
类型名,数组名[数组长度];
例如:
int a[10];
定义了一个一维数组a,包含10个int型的数组元素,即a[0]、a[1]、 a[2]、…a[9]。
每个数组元素有一个序号(也称为下标)。
一维数组的元素,不但在名称上是有序的,在内存中的存储也是连续且有序的。
数组元素的有序性特点,使得数组元素适合于采用循环处理。
(以后题目大部分都跟循环有关,毕竟都在一行里面,顺序结构多舒服,排着顺序输入输出多好,难道还一个个手动吗,那也就没数组的必要了)
这就有意思了,a[10]是从a[0]到a[9]数一下,0到9是十个数字对吧,先把数目对起来,不能缺斤少两啊。
然后呢为啥从0开始,这个跟C语言的取地址啊啥的有关,不从0的话计算量会增大,这只是其中之一,我感觉有一篇解释文章挺好的,放在下面了,有兴趣可以去看看
ok,为啥从0开始就解释清楚了,然后数目(或者正规一点:元素个数)也对起来了
链接:
为什么很多编程语言中数组都是从 0 开始编号.
点击上面的蓝字或手动
https://blog.csdn.net/Hanoi_ahoj/article/details/82931630
版权声明:为CSDN博主「ahojcn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2.一维数组长度
在C89标准中,不允许定义变长数组,即在表示数组长度的表达式中,不能包含变量名。
而在C99标准中,则允许定义变长数组。即数组长度可以是整型变量或整型变量的表达式。
例如:
int n=10;
int a[n];
//在C89标准中是错误的。
//在C99标准中正确合法
在程序中,一般不能将一维数组作为一个整体进行输入、输出和运算。
而只能针对一维数组的元素进行操作。
这个操作方法跟以前一样,本质上他还是个变量,怎么操作变量就怎么操作数组。一把菜刀跟一堆菜刀放在一起还能变成屠龙刀吗?
int a[10];
a[0]=100;
//a[0]是数组元素。
a[10]=200;
/*是错误的
因为数组a中没有a[10]这个元素
这种错误称为下标越界
在程序中引用数组元素时,数组元素的下标可以用变量表示。
很多数组题目都是这么玩的,就因为数组下标可以用变量表示
对数组元素的操作方法,与同类型变量的操作方法相同。
i=0;
a[i]=100;
//等价于
a[0]= 100;
printf("%d",a[i]);
printf("%d",a[0]);
3.例题:输入10个整数存入一维数组中,再按逆序输出。
编程思路:
首先定义如下数组和变量: int a[10],i;
然后完成该数组元素的输入与输出。
int a[10],i;
a[10]就是因为10个元素
他要是说100
就a[100]
i就是那个变量了
i就为为了存放下标的
首先用顺序结构完成输入:
i=0;scanf("%d",&a[i]);
//等价于scanf("%d" ,&a[0]);
i=1;scanf("%d",&a[i]);
i=2;scanf("%d",&a[i]);
i=3;scanf("%d",&a[i]);
i=4;scanf("%d",&a[i]);
i=5;scanf("%d",&a[i]);
i=6;scanf("%d",&a[i]);
i=7;scanf("%d",&a[i]);
i=8;scanf("%d",&a[i]);
i=9;scanf("%d",&a[i]);
上面就是不用循环的后果
上述语句组可以归纳为如下的循环:
for(i=0;i<=9;i++)
scanf("%d",&a[i]);
同样逆序输出
然后用顺序结构完成输出:
i=9;printf("%d",a[i]);//等价于printf("%d ",a[9]);
i=8;printf("%d",a[i]);
.....
i=0;printf("%d",a[i]);
上述语句组可以归纳为如下的循环:
for(i=9;i>=0;i--)
printf("%d",a[i]);
完整源程序
#include <stdio.h>
int main()
{
int a[10],i;
printf("请输入10个整数: \n");
for(i=0;i<=9;i++)
scanf("%d",&a[i]);
printf("逆序输出的结果: \n");
for(i=9;i>=0;i--)
printf("%d",a[i]);
printf("\n");
return 0;
}
效果如下
4.一维数组初始化
在定义一维数组的同时,给数组元素赋值,称为数组的初始化。
- 给所有元素赋初值:
int a[6]={1,3,5,7,9,10};
- 可以只给部分元素赋初值。
例如:
inta[6]={1,3};
此时,其它元素自动取0。
- 初始化时,可以不指定一维数组的长度。
例如:
inta[]= {1,3,5,8,9};
系统编译时,能根据初值的个数自动确定数组长度。
不过,inta[];这种形式是错误的,因为无法确定数组的长度。
就不想写的很长,那样太长了不想看,所以我就分开写