c语言中关于数组的相关内容以及关于goto语句的扩展

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

    1、前言;

    2、goto语句的扩展加上上期代码截图;

    3、一维数组;

    4、两种求数组长度的方法;

    5、二维数组;

    6、变长数组;

    7、题;

    8、总结;

前言

  上期我们讲完了循环与分支的所有内容,本期我们就来讲解c语言中另一个重要的内容“数组”,

数组自如其名,一堆”数字”的集合,但是我为什么要将数字用双引号括起来呢?这个数组又有什么特点呢?我们又为什么学习呢?接下来我们就将为您解答这些问题;(本人实力有限,对知识的见解可能有不足,欢迎指正,大家找对自己有用的用即可,我会尽力用通俗易懂的语言为大家解答);

一、goto语句的扩展加上上期代码题的代码讲解;

    在开始今天的讲解前先介绍一下goto语句的使用,在英文中go代表着去,goto以为着去哪,那大家猜一猜这个goto语句的具体是干什么的?这里给个代码大家可以先看看;

看出来了吗?是不是有点奇妙?,为什么我们不满足if语句的条件也进去了?goto语句后边有个again,然后在下边还有个again与goto语句相对应,哎?既然大家学计算机的都玩过我的世界吧,我的世界里有个传送门,其实goto语句就和传送门一样,进去了就传送到对应的地方了,所以进入goto后找到again了就传送了,这个goto语句后边的单词可以随便写这里只是写了一个again,只是取个名而已,注意goto语句后面是分号,而下边所对应的那个词是冒号:,这里容易出错,这个again可以放在goto前也可以放在他后边;goto语句在一定的场所有着很大的作用,在一个很多层的循环中是不是一个goto语句就可以离开了,就像你穿了很多衣服,,这个goto就像是一键脱衣,省去了很多麻烦。接下来有了基础我们可以把我们上期的题的代码传过来了,因为在这个代码我运用了goto语句

这是用case语句的,输入3从分支3进入然后break;最后打印然后请看最后一个default,我们知道这个default是将除了上边的1,2,3,4,5,6,7的其他情况,那猜一下如果我输入一个8会发生什么?

,看printf(“输入错误,请重新输入”)后goto again语句,这个所对应的again出现在最上边的scanf函数,再看运行结果后边的光标,知道了吧输入错误后传送到上边的scanf重新输入直到输入1~7为止,

这个是if语句的这个运行结果更容易看出来,就不再追溯了;

三、一维数组;

 1、数组定义;

        首先解释一下数组的定义,数即“数字”,只不过这个数字不止是阿拉伯数字,字符也可以哦,组就是组合,所以数组就是一堆“数字”的组合,既然是集合,那数组元素个数不能为0;可以初始化啊,但0不也是数字吗,数组啊里边的元素必须得是同一类型的才可以,就像我们的宿舍,志同道合的人住的舒服哦,这些元素也是如此,想找朋友哦;这里介绍一下数组的结构,

类型    数组名[常量值]={},类型可以是int,char之类的,而数组名就是取的名字而已,常量值就是阿拉伯数字只能是整数,而且不能为变量,而[]这个是一个操作符,不是一个普通的框子啊,就相当于我们家门口的门牌子,而框子里的常量值就像是门牌子上的地址,我们顺着地址可以找到你家,同理这里就可以找到数组的地址哦,前边提到过初始化,这里初始化分为完全初始化还有部分初始化,完全初始化就是全部告诉你了,部分初始化就是有一部分告诉你了还有一部分没有告诉你,下边还会继续提。

    那么数组具体张什么样呢?就好像一个一个的方格子紧紧的挨在一起,他们是连续分布的不是这一个那一个的这里我们定义了一个数组a,我们可以看到这个数组内有7个格子都是紧紧挨在一起的,那我们怎么找到一个数组呢,你比如说我想找到第三个格子的地址咋的找?这里我们就用到数组的下标作用了,有门牌有地址不就可以出去串门了,   

我们可以看到啊,a[7]代表着我们创建了一个叫a的一共有7个格子的数组,而下边的绿色数字就是各个格子的地址我们叫做下标,注意下标是从0开始的不是从1开始的,所以最后的格子地址是7-1等于6;这里考的很多,那我们怎么找到第三个格子?是不是下标为2的那个所以,a[2]这代表着a数组2为下标的值也就是我们上边的第三个格子;

      2、数组的输入及输出;

     那么既然数组是个集合,那么怎么输出呢,多个元素输出是不是要用循环呢,你想啊,如果不用循环是不是只能一次输出一个,用了循环才可以将数组内的内容全部输出,所以啊接下来一张图带大家看看数组的输出

这里定义了一个数组arr,这个只是去了个名字而已,你也可以叫a都行,主要是看for循环是怎样将我们数组内的元素输出的,在for循环中从arr[0]到arr[5]全部遍历输出,当然如果你细心的话就会发现我最上边的arr数组框子内并没有写值,为什么呢?是因为编译器会自动判断数组内的元素个数,可以不用自己写;那输入也同样如此,将for循环内的printf函数改为scanf函数即可,这里不再追溯。那如果说不用for循环输出我们的数组会发生什么?好奇嘛?接下来我们用一段代码告诉大家答案,

出现了一堆数字,不理解?没关系,大家直到“&”这个符号的意思吗,这个是去地址符,用这个就能找到元素的地址,那

再看看这张图,哎?为什么两个数是一样的?第二个是取的数组的地址啊,那猜到了吗?如果想要输出arr数组的话是输出了地址,只有输出arr[1]这样的才可以输出我们的数组内部的元素,只是printf arr的话只会输出地址,那为什么就只有一个数或者说只有一个地址?

看看右边的运行结果再看看我们左边的代码,发现了没有arr数组的地址是数组元素的首地址,而且,每个地址之间都差4,为什么呢?运气吗?记不记得上边提到过一个知识是:数组是元素一个一个紧挨着的元素的集合,但为什么这里差4呢?因为我们定义这个数组为int整形数组,每个整形大小占4个字节,所以这也证明了数组确实是紧挨在一起的;一维数组差不多也就这点东西了;

四、两种求数组长度大小;

    看上边那个数组arr[]={1,2,3,4,5,6};我们可以数出来有六个元素,这样才用的for循环来循环6次,那如果arr[]={1,2,3,4,5.........}怎么办?这时候就用的上我们的求数组大小了,这里提前了解一下,我们之前不是说数组中的“数”不单单指的是阿拉伯数字也只字符吗,一个一个的字母可以叫字符,就像这样{a,s,d};这里有三个字符,那如果我想输出一个英文单词怎么办,这里就要介绍一下字符串了,多个字符连在一起就叫做字符串,一个一个的字母就叫字符,就像一个一个的小羊肉就叫羊肉,如果串在一起就叫羊肉串了,那比如说这里char a[]="nbplus";双引号就叫做一个字符串,这个双引号不能少,这是一个符号,专门来引用字符串的,接下来我会演示的,这里先了解一下;

      第一种用sizeof来求长度,举个例子就知道sizeof怎么用了,假如一瓶水有1升水,但是你一次喝0.1升,那么求你一瓶水喝几次。是不是喝10次啊,这个方法也是如此,sizeof是求大小的,如果我知道数组整个大小再知道一个元素的大小,那数组内有多少个元素这还不知道吗?来串代码看看,

看到了没,不用自己算就将数组内的个数给算出来了;接下来输出一个字符串试一下

哎?发现了没abcdefg,不应该是7个吗为什么是8,为什么呢?是有8个字符吗?对的在字符串末尾有一个'\0'字符,7+1不就等于8了吗,呢\0是什么呢?这是字符串的结束标志,一个字符串看到斜杠0就知道结束了,接下来介绍第二种。

    strlen函数这个仅用于计算字符串的长度哦;来一个

哎?为什么这个strlen输出的就为7呢?对比一下,我们大致可以猜到,是不是strlen只计算‘\0’之前的字符啊,这里提醒一下在用strlen函数之前需要包含<string.h>头文件。

五、二维数组

  1、二维数组的定义

      接下来讲解一下二维数组,还是非常简单的,如果把一维数组比作成为一层楼的话,二维数组就相当于一栋楼房,多个一维数组摞在一起就是二维数组,二维数组和一维数组一样,下标都是从0开始的,这里非常容易错,简单介绍一下二维数组的结构吧int arr[][],这里表示第几行第几列哦,来张图看看

这就是我们定义的一个二维数组,结构就是这样,剩下的以此类推,但是唯一需要注意的一点是二维数组与一维数组的下标都是从0开始的,二维数组不管是行列都是从0开始的;

    2、二维数组的输出;

   二维数组是二维的要怎么来打印呢?这里用到了循环的嵌套,就是循环内的循环,来一段代码为大家解释一下吧,这样也比干说生动些;

在这里我们定义了一个3行5列的二维数组,我们可以发现一个for循环嵌套在一个for循环内,我们先分析一下这两个for循环,首先进入第一个for循环后i=0代表着第一次循环,但也代表着打印第一行,然后进入第二个for循环,在这里j=0要一直循环5次才可以出第二个循环吧,那是不是就代表着我们把第一行的五个元素输出完毕,接下来退出第二个for循环后再上来执行第二次第一个for循环也就是第二行,然后再打印每行的每个元素,最后打印完每行就换行,直到打印完我们的三行后退出,这就是上边那两个for循环的意思,这同理也是二维数组的输出,那我们可以看到最上边关于二维数组的初始化啊,我们发现我们arr数组大括号内扩了几个小括号,小括号内的内容代表着每行内的各个元素,发现了没有结合运行结果,第一个小括号内是1,2,3,4,5,那我们第一行就打印1,2,3,4,5;然后第二个括号内是6,7,8;我们原来定义这个数组是多少?5列吧,但是这只给了3个元素还有两个元素没给,编译器在这里为了填满我们的元素就会填0,结合上面的运行结果我们便可知道这一点,这就叫部分初始化哦!提醒一下二维数组行可以不给数,但是列一定要给数啊,就[][]里的,前边的框子可以不写数,但是后边的框子一定要给数啊,给了列的话编译器可以自己弄行数,

看到了没,如果把行数去掉了,只给5列发现可以吧,但是运行结果也变了发现没有,为什么呢?一共12个数字,12除以5等于2,是不是前10个数字可以排满前两行,最后一行剩两个还有3个位置没有被占,此时编译器就会把没有占的位置填0,相信看过上边内容的读者知道哦。

    那根据一维数组的前提下我们知道数组的地址是数组元素的首地址,既然二维数组和一维数组是一样的,那么大家猜一下二维数组的首地址是什么呢?

猜对了没数组的地址是arr[0][0]的地址哦,这和一维数组一样嘛,再注意下不同行的地址,发现了没有第一行的末尾和第二行的初差4,说明什么呢?二维数组之间每个元素和一维数组一样的是紧紧挨着的,画个图生动一下,

这样生动了吧;每一行看似是在不同的行,其实他们都是相互联系的哦,通过地址就可以看出来了;

六、变长数组

    前情提要,变长数组要在C99版本及以上的编译器才能用哦,所谓变长数组,不是说空间满了就变长不是这样哦,是你输入一个数这个数决定你这个数组的长度大小,你比如说输入5,那么就创造了一个可以存储5个元素的数组,输入6就创造了一个可以储存6个元素的数组,就这样,来一个代码看看,

这里用了goto语句哦,为什么说要C99版本以上的编译器呢?因为我们最开始的时候定义的数组arr下标符内放了个变量n,C99一下的这样是非法的,不能这么写,就这样,变长数组没什么好讲的可以好好看看这些代码哦;

七、题

     1,给定一个数组arr[]={1,2,3,4,5,6};用编程计算数组元素的和;

八、总结

    在本期我们讲解了数组的内容,其中讲解了一维数组,二维数组,变长数组,以及计算数组内的元素个数,作者水平有限,若知识有误欢迎指正,如果喜欢内容那就关注一下,后期会更新更多内容的,本号将贯穿作者从大一到就业学习内容的总结;

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值