第一个冷知识,输入到scanf里面的内容都是字符串形式,但是! scanf(“%d”,&a),%d决定了如何对输入的字符串进行操作
scanf用来读取标准输入,标准输入的内容需要放入到某个变量空间中去,因此变量名必须要取地址。
scanf函数在读取整型数,浮点数,字符串都会忽略’\n’,’ '(换行符和空格),怎么忽略呢?
inti,j;
scanf("%d",&i);
scanf("%d",&j);
//输入第一个数字然后要敲一个换行符我们的换行符是无法被int型的数字匹配的所以只能忽略,类似的不是单个字符类型都会把他忽略。
多次读取的问题
int i;
int ret;//scanf()会返回匹配成功的个数
float j;
char c;
ret=scanf("%d%c%f",&i,&c,&j);
//如果输入123空格a空格123.0会出现错误,此时情况:i匹配123 c匹配空格,f无法匹配a,也无法忽略匹配成功两个
//如果解决??
scanf("%d %c %f",&i,&c,&j);//直接加一个空格最省事
做个比喻高铁上面有很多位置,一节车厢里面的位置从1开始,数组可以看做是这个车厢,而数组元素可以看作是这个车厢里面的乘客,全部的乘客在车厢里,就类似数组的元素构成了数组本身这个概念。
定义的形式为:类型说明符 数组名[常量表达式]
例子:int a[4],float b[3-1]都是满足定义形式的。
声明数组的规则:
1.数组名命名符合变量名命名规则。
2.定义数组时必须指定数组中元素个数。比如高铁上面的位置数量不确定就没法让车厢拿出来使用
3.常量表达式中不可以出现变量值,即在初始化中无法对数据大小做动态定义,int n;a[n]这是不可以的。
数组的初始化
int b[5]={1,2,3,4,5};//直接声明数组大小然后赋值
int b[]={1,2,3,4,5};//也可以不进行数组大小的声明,数组的长度是可以通过数组元素来确定的。
int b[5]={0};//数组长度确定但是没有逐个赋值都默认为0元素
数组的访问越界
访问越界是个什么东西呢??我们平时说你越界了,在这里值的是什么呢?我们可以想象一下一节高铁车厢有20个位置,但这时候我们买到了一个21号的位置,哪里来的21号位置??是不是不存在,他确实不存在,这时候乘务小姐姐穿着黑丝过来说到,这是我们系统的问题,21号位置对应的下一个车厢的第一个,而下个车厢的第一个是有人做的,此时你抢先他一步做到下一届车厢的第一个位置,用21的越界票做到了位置,这时候一号来了,问,这不是我的位置吗?你说购票系统出问题了,我越界到了你的位置,我代替了你,你去找乘务员反应吧哈哈哈。。。。。
这是一个不恰当的举例起码他没有反应先后的赋值的问题,后来的才是会占据该地址的。我们来看实际的操作把
int a[4]={1,2,3,4};
int j=0;
int k=0;
a[4]=5;
a[5]=6;
a[6]=5;
a[7]=6;
printf("%d",j);
printf("%d",k);
这时候会怎么样呢???这里应该都会说哪有a[4],a[5]吖到了a[3]就没了,我知道你很急但你先别急,这个就是越界的一个形象的例子,这种错误机器是不会检查的,毕竟数组就是一个接一个的地址,你直接按照地址去改完全没毛病,只不过这种操作会妨碍我们。
请看断点
a的地址就四个地址,没毛病,我们再来看下面几个地址
我们会发现在这里数组到了a[3]之后的地址也可以被找到的,虽然没有对a[3]之后的数组有定义,原理就是根据地址的操作,我们也可以看见a[6],a[7]的地址与jk重合了,所以对67的赋值就是对jk的重新赋值
数组越界的情况就是这样的,但是聪明的你肯定一般没事不会这么写代码,但毕竟这个机制在这里所以我们就会害怕,万一越界了把什么变量的值给改了,整出什么幺蛾子我们都是负担不起了,所以这个情况一定要尽可能的去防范。