1.一维数组的定义
C语言中的标识符要求先定义、后使用,数组也不例外,使用前必须先定义,其定义格式如下:
类型说明符 数组名[常量表达式];
其中:
(1)类型说明符是任意一种基本数据类型或构造数据类型,又叫基类型,它指的是数组中可以存储的数据的类型,一旦定义,数组中所有的存储单元都是该类型。
(2)数组名是用户自定义标识符,符合C语言命名规则即可。
(3)方括号中必须是常量表达式,也可以是字面常量或符号常量,其值指定数组中存储单元的个数,也称为数组的长度,是数组中能够存储的数据个数的最大值。比如常量值为10,则说明该数组中包含10个存储单元,最多可以存储10个数据。例如:
这些都是合法的定义形式。
(4)数组所需内存是在程序编译时由编译器根据方括号中的常量值分配,一旦程序编译完成,数组长度不可改变。如有以下定义:
这是一个错误的定义,其基本想法是想让数组的长度定义为输入的n值,这是行不通的,因为数组的长度是在编译时被确定,不能在程序执行过程中来确定。或者简单说,数组定义时方括号中只能是常量,而不能是变量。
(5)数组被定义后,其所需空间在内存中分配的是一组地址连续的内存。如有定义:int a[5],该数组在内存中的存储结构如图6-1所示。
图6-1 一维数组存储结构
由图6-1可知,数组中的所有单元连续存放,由于每一个单元是int类型,占4个字节,所以单元的地址相差为4。数组名字a代表的就是数组的起始地址。
在定义数组时,允许一个说明中同时定义普通变量和数组,如:
int x,a[10],b[10];
2.一维数组元素的引用
在C语言中不能够对数组进行整体的引用,一个数组相当于是一次定义了一批存储单元,引用时也只能按单元引用,其用法同使用一个普通的变量没有区别。为了区分每一个存储单元,我们为每一个单元从0开始依次赋予一个唯一整型编号,此编号就是“下标”。用数组名和下标可以唯一地确定一个存储单元,其引用格式如下:
数组名[下标];
引用数组元素时应注意:
(1)下标值必须是整型的,可以是常量或表达式,如有定义:
int a[20];
则引用:
a[5]=3;
a[3*5]=10;
都是正确的引用方式。
(2)注意数组的下标范围是0~数组长度-1,引用时不能超出数组的下标范围,否则将产生“越界”错误。
(3)数组下标可以是变量,例如:
int a[20];
则:
a[i]代表数组a的i号单元,当i从0变化到19时,可以遍历数组的每一个存储单元,这很方便我们对每一个数组元素的处理。
【例6-1】输入5个整数并将之按输入顺序的逆序输出。
【程序说明】
(1)因为要输入和输出多个数据,将循环和一维数组相结合逐个单元输入/输出是处理数组中数据的一般方法。
(2)每一个数组元素的使用方法同普通的变量一样,如输入中&a[i]代表数组a中i号单元的地址,这同普通变量的输入是一样的。
(3)i是一个下标变量,同时用作了循环变量,在i自加或自减时,a[i]依次代表每一个数组元素的引用。
3.一维数组的初始化(www.xing528.com)
所谓数组初始化是指在定义数组的同时给数组元素赋一个初值,数组初始化是在程序编译时完成,这样将减少程序运行时间,提高程序执行效率。
数组初始化的一般形式为:
类型说明符数组名[常量表达式]={元素值列表};
其中“元素值列表”即为要赋给数组元素的一批值,各值之间用逗号分隔,初始化将从数组的0单元开始,依次将“元素值列表”中的每一个值赋给数组的相应的存储单元。
C语言对数组的初始化时有以下几种形式:
(1)定义数组时对全部数组元素赋值。
例如:
int a[5]={10,20,30,40,50};
则相当于:
a[0]=10;a[1]=20;a[2]=30;a[3]=40;a[4]=50;
(2)可以只给部分元素赋初值,例如:
int a[10]={10,20,30,40,50};
则相当于:
a[0]=10;a[1]=20;a[2]=30;a[3]=40;a[4]=50;
由于初始化从0单元开始,因此当{}中列举的常量个数少于数组元素个数时,只给前面部分元素赋值,后面的其他单元全部初始化为0。
如上例中只给a[0]~a[4]的5个元素赋值,而后5个元素系统会自动赋0。
如果要将a中所有的元素赋值为0,可以写成:
int a[10]={0};
此时将0放入a[0],后面的单元系统全部自动赋值为0。
(3)如给全部元素赋初值,由于数据的个数已经确定,则在数组定义数组时可以不给出数组的长度。
例如:
int a[5]={1,2,3,4,5};
可写为:
int a[]={1,2,3,4,5};
这时数组的长度等于后面赋值元素的个数5。但是当数组长度和列举的数组元素个数不一致时,数组长度不能省略。
对数组初始化时,还应注意以下方面:
(1)初始化是在定义的同时赋初值,不是定义完成后再赋值。例如:
int a[5];
a={1,2,3,4,5};//数组名代表数组的起始地址,不能赋值。
a[5]={1,2,3,4,5};//a[5]代表a的5号单元,越界,且一个单元中也不能保存5个值。
这是初学者非常容易犯的错误,笔者在教学过程中经常遇到。
(2)程序中可以用循环给每一个单元赋值,但和初始化不同。
例如:
int a[5],i;
for(i=0;i<4;i++)
a[i]=i+1;
此循环也可以将1~5依次赋给a[0]~a[4],但和初始化语句:int a[5]={1,2,3,4,5}不同,前者是在程序执行过程中完成,占用程序执行时间,后者是程序编译时完成,不占用程序的执行时间。
【例6-2】求出n(n<=40)以内的斐波那契数列,n由键盘输入。
程序中定义N为40是斐波那契数列中最大项数,fib数组定义为N+1是因为真正的斐波那契数列是从1单元开始存放,0单元只是作为辅助,在输出时其值并不输出。n是从键盘输入的实际的要输出的斐波那契数列的项数,输入时保证n≤N。程序中利用数组初始化,将fib[0]和fib[1]分别初始化为0和1,其他的单元系统自动初始化为0,然后从fib[2]开始利用斐波那契数列的特点依次计算每一项并输出。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。