超女选秀的第一组有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)
作者:码农有道
如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!
如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!