C语言数组

 

       超女选秀的第一组有5名超女,请提供一个界面,输入每位超女的体重,最后计算出超女的的平均体重。

       用我们之前学习过的知识,程序示例如下:

       示例(book41.c)

      

       如果有100名超女,这个程序将会很长很烦锁。

数组

       数组(array)是用于储存的一系列类型相同的数据。数组有一个数组名,通过下标访问数组中元素(element)。

       数组定义的语法是:

              dataType arrayName[length];

       其中,dataType 为数据类型,arrayName 为数组名,length为数组的长度。

       例如:

              double money[20];

       声明money是一个内含20个元素的数组,每个元素都可以储存一个double类型的数值。数组的第1个元素是money[0],第2个元素是money[1],以此类推,直到money[19]。注意,数组下标的编号从0开始,不是从1开始。可以给每个元素赋double类型的值。例如,可以这样写:

       money[0] = 10.55;

       money[1] = 32.54;

       money[2] = 2055.65;

       ……

       money[19] = 2055.65;

       定义数组的时候,数组的长度必须是整数,可以是常量,也可以是变量。

       数据的下标也必须是整数,可以是常量,也可以是变量。

       使用数组元素和使用同类型的变量一样。例如,可以这样把值读入指定的元素中:

              scanf("%lf", &money[4]);   // 把一个值读入数组的第5个元素

       数组的类型可以是任意数据类型。

              int      no[22];    // 可储存22个int类型整数的数组

              char    actors[26]; // 可储存26个字符的数组

              double big[500];  // 可储存500个double类型整数的数组

占用内存的大小

       数组是有多个变量组成,占用内存的空间为多个变量占用的内存之和,如下:

              int ii;       // 定义一个整型变量

              printf("sizeof(ii)=%d\n",sizeof(ii));    // 输出结果:sizeof(ii)=4

       等同以下代码

              printf("sizeof(ii)=%d\n",sizeof(int));    // 输出结果:sizeof(ii)=4

 

              int ii[10];    // 定义一个整型数组变量

              printf("sizeof(ii)=%d\n",sizeof(ii));     // 输出结果:sizeof(ii)=40

       不能用以下代码

              printf("sizeof(ii)=%d\n",sizeof(int));   // 输出结果:sizeof(ii)=4

数组的初始化

       采用memset函数对数组进行初始化,如下:

              memset(no,0,sizeof(no));

              memset(actors,0,sizeof(actors));

              memset(big,0,sizeof(big));

       第一个参数是数组名,第二个参数填0,第三个参数是数组占用的内存空间,用sizeof(变量名)获取。

注意事项

       1、定义数组的时候,数组的长度必须是整数,可以用常量和变量

              int size=100;

              int numbers[size];

       在很久很久以前,定义数组的时候,数组大小必须是常量,不知道从什么时候开始支持了变量,目前很多书籍中仍认为不支持变量。

       对C语言来说,这是一个里程碑的进步,C语言动态内存技术的应用范围将变得更小。

       2、使用数组的时候,数组的下标也必须是整数,可以用常量和变量,这个特征从未改变。

       3、使用数组的时候,C 编译器不会检查数组的下标是否正确,但是在程序中下标一定不能越界。当运行程序时下标越界,相当于访问了其它程序的内存,操作系统不允许程序这么做,可能会导致程序异常中断(Core dump),后果非常严重。

       示例(book43.c)

      

       运行结果

      

       段错误,就是程序非法操作内存,引起程序的崩溃。

在for循环中数组

       在学习了数组的知识以后,本章节开始的需求有了更好的解决方法,程序book41.c必须修改。

       示例(book41.c)

      

       运行结果:

      

       for循环提供了一个简单直接的方法来使用数组下标。程序使用数组和for循环处理数据,这比使用5个单独的scanf语句方便得多。不管是5个还是100个超女,程序不必再增加一行代码。

二维数组

       在我们现实生活中,二维数组到处都是,例如一栋房子有6层,每层有4个单元。

       二维数组定义的语法是:

              dataType arrayName[length1][length2];

       其中,dataType 为数据类型,arrayName 为数组名,length1 为第一维下标的长度,length2 为第二维下标的长度。

       我们可以将二维数组看做一个 Excel 表格,有行有列,length1 表示行数,length2 表示列数,要在二维数组中定位某个元素,必须同时指明行和列。

       如果要表达一栋房子的房间,6层,每层4个单元。

              int house[6][4];

              house[0][0]    house[0][1]    house[0][2]    house[0][3]

              house[1][0]    house[1][1]    house[1][2]    house[1][3]

              house[2][0]    house[2][1]    house[2][2]    house[2][3]

              house[3][0]    house[3][1]    house[3][2]    house[3][3]

              house[4][0]    house[4][1]    house[4][2]    house[4][3]

              house[5][0]    house[5][1]    house[5][2]    house[5][3]

       也可以将二维数组看成一个坐标系,有 x 轴和 y 轴,要想在一个平面中确定一个点,必须同时指定 x 和 y 值。

二维数组的初始化也是用memset,例如:memset(house,0,sizeof(house));

       把本章节开始的需求增加一点难度:超女选秀有3个组,每组有5名选手,请提供一个界面,输入每个超女的体重,最后计算每个组的超女的平均体重。

       示例(book42.c)

      

       运行结果:

      

多维数组

      从二维数组可以类推出更多维数组的用法,在实际开发中,二维以上的数组应用场景非常少。

      对初学者来说,建议不要把这个问题复杂化,能掌握一维和二维数组就可以了。

字符串

       字符串是一个特别的字符数组,如果字符数组包含了空字符'\0',则该数组中的内容就是了一个字符串。

       '\0'可以直接写成0。

      

       不要问为什么这样表示,这个也是约定,是规则。

       因为字符串需要用\0结尾,所以在定义字符串的时候,字符数组的长度要预留多一个字节。

              char strname[21];  // 定义一个最多存放20个字符或10个汉字的字符串

       空字符\0,也就是0,如果想在strname中存入字符串“hello”,可以采用以下代码。

      

       你可能会问,如果字符串不用\0结尾,会有什么样的结果,我们用代码来演示一下:

      

       运行结果:

      

       可以看到,输出abc之后,有乱码,并且每次执行程序输出的结果不可预知。

字符串数组

       以0结束的一维字符数组是一个字符串,给一维字符数组加上一维,就是字符串数组了。

              char strname[21];       // 可以存放20个字符的字符串

              memset(strname,0,sizeof(strname));

              strcpy(strname,"我真的可以存十个汉字");

 

              char strname[10][21];   // 10个字符串,每个字符串可以存放20个字符

              memset(strname,0,sizeof(strname));

              strcpy(strname[0],"坦已");

              strcpy(strname[1],"褒似");

              strcpy(strname[2],"西施");

              strcpy(strname[3],"王昭君");

              strcpy(strname[4],"貂婵");

              ……

              strcpy(strname[9],"陈圆圆");

版权声明

C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

来源:C语言技术网(www.freecplus.net

作者:码农有道

如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!

如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!

 

 

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C语言技术网-码农有道

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

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

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

打赏作者

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

抵扣说明:

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

余额充值