十、数组(1):一维数组
1、数组的使用
什么是数组?
——是一种容器(放东西的东西),特点是:
(1) 其中所有的元素具有相同的数据类型;
(2) 一旦创建,不能改变大小;
数组中的元素在内存中是连续依次排列的。
——可以出现在赋值的左边或右边
a[2]=a[1]+6;
定义数组
——<类型> 变量名称 [元素数量];
int grades[100];
double weight[20];
——元素数量必须是整数
C99之前:元素数量必须是编译时刻确定的字面量
数组的单元
——数组的每个单元就是数组类型的一个变量
——使用数组时放在[]中的数字叫做下标或索引,下标从0开始计数:
grades[0]; grades[99]; average[5];
有效的下标范围
——编译器和运行环境都不会检查数组下标是否越界,无论是对数组单元做读还是写。
——一旦程序运行,越界的数组访问可能造成问题,导致程序崩溃。(segmentation fault)
——但是可能运气好,没造成严重后果。
——所以这是程序员的责任来保证程序只适应有效的下标值:[0,数组的大小-1]。
长度为0的数组?
——int a[0];
——可以存在,但是无用。
2、数组的例子
投票统计
——写一个程序,输入数量不确定的【0,9】范围内的整数,统计每一种数字出现的次数,输入-1表示结束。
#include<stdio.h> int main() { const int Number=10; //数组大小C99 int x; int count[Number]; //定义数组 int i; //初始化数组 for(i=0;i<Number;i++) { count[i]=0; } scanf("%d",&x); while(x!=-1) { if(x>=0&&x<=9){ count[x]++; //数组参与运算 } scanf("%d",&x); } //遍历数组输出 for(i=0;i<Number;i++){ printf("%d :%d\n",i,count[i]); } return 0; }
3、数组运算
——在一组给定的数据中,如何找出某个数据是否存在?
#include<stdio.h> /** 找出key在数组a中的位置 @param key 要寻找的数字 @param a 要寻找的数组 @param length 数组a的长度 @return 如果找到,返回其在a中的位置; 返回如果找不到则返回-1 */ int search(int key,int a[],int length); int main() { int a[]={2,4,6,7,1,3,5,9,11,13,23,14,32}; int x; int loc; printf("请输入一个数字:"); scanf("%d",&x); loc=search(x,a,sizeof(a)/sizeof(a[0])); if(loc!=-1){ printf("%d在第%d个位置上\n",x,loc); }else{ printf("%d不存在\n",x); } return 0; } int search(int key,int a[],int length) { int ret=-1; int i; for(i=0;i<length;i++){ if(a[i]==key){ ret=i; break; } } return ret; }
数组的集成初始化
int a[]={2,4,6,7,1,3,5,9,11,13,23,14,32};
数组的大小
——sizeof给出整个数组所占据的内容的大小,单位是字节。
sizeof(a)/sizeof(a[0])
——sizeof(a[0])给出数组中单个元素的大小,于是相除就得到了数组的单元个数。
数组的赋值
——数组变量本身不能被赋值
int a[]={2,4,6,7,1,3,5,9,11,13,23,14,32}; int b[]=a;//这是错误的。
——要把一个数组的所有元素交给另一个数组,必须采用遍历。
for(i=;i<length;i++){ b[i]=a[i]; }
遍历数组
——通常都是使用for循环。
数组作为函数参数时,往往必须再用另一个参数来传入数组的大小。
int search(int key,int a[],int length);
——数组作为函数的参数时:
(1)不能在[]中给出数组的大小;
(2)不能再利用sizeof来计算数组的元素个数。