1.数组的定义:
数组就是具有一定顺序关系的若干变量的集合。其中的每个变量,都被称为数组的元素。从定义中,我们可以看出几个关键点:
首先,组成数组的元素是若干个独立的变量。
其次,这些变量的数据类型必须相同。
最后,变量之间有一定的顺序关系。
数组属于构造数据类型。一个数组可以分解为多个数组元素。这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可以分为数值数组、字符数组、指针数组、结构数组等。
C语言中使用数组必须先定义。一维数组是指只有一个下标的数组,说明形式为:
<存储类型> <数据类型> <数组名>[常量表达式]
存储类型指的是:auto,register,static,extern。默认为auto。
数据类型可以是任一种基本数据类型或构造数据类型。
数组名是用户自定义的数组标识符。
方括号中的常量表达式表示数据元素的个数,也称为数组的长度。
对于数组的定义,这里有几点是需要特别注意的:
(1)数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
(2)数组名应当符合标识符的命名规则,即由字母、数字和下划线组成,但不能以数字开头。
(3)数组名不能与其他变量名相同。例如,以下书写是错误的:
int main()
{
int a;
float a[10];
return 0;
}
(4)方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素,它需要在数组定义时就确定下来,不能随时随着程序的运行动态更改。它的下标从0开始计算,因此5个元素分别为:a[0]、a[1]、a[2]、a[3]、a[4]。
(5)不能在方括号中用变量来表示数组元素的个数,但是可以是符号常数或常量表达式,如:a[3+2]、b[9-6]。
(6)允许在同一类型说明中说明多个数组和多个变量。
2.一维数组的引用
C语言中规定了数组必须逐个元素引用,而不能整体引用。举例如下:
int a[10];
printf("%d\n",a);
上面的用法是错误的,数组的引用实际上就是数组元素的引用。数组元素的 一般表示方法为
数组名[下标]
其中的下标只能为整型常量或整型表达式。举个例子来演示数组的使用,计算Fibonacci数列前十项并逆序给出结果:
#include <stdio.h>
int main()
{
/*数组定义,有十个元素*/
int a[10],i;
a[0] = a[1] = 1;
for(i = 2; i<10; i++){
/*下标为整型表达式,注意标号范围0-9*/
a[i] = a[i-2] + a[i-1];
}
printf("Fibonacci bumbers...\n");
for(i = 9; i >= 0; i--){
/*下标为整型表达式,注意标号范围0-9*/
printf("a[%d] is %d\n",i,a[i]);
}
return 0;
}
其运行结果如下所示:
Fibonacci numbers...
a[9] is 55
a[8] is 34
a[7] is 21
a[6] is 13
a[5] is 8
a[4] is 5
a[3] is 3
a[2] is 2
a[1] is 1
a[0] is 1
通过下标就可以很方便地访问数组中的元素,但是,一定要注意下标从0开始,范围为0~n-1
其中,n为元素个数。假如,引用数组元素时,下标越界了,结果将是不可预估的。数组的越界操作相当于内存访问越界,这种错误所造成的结果是无法估计的,因此在引用数组元素时,一定要仔细处理下标,以防出现数组越界问题。
3.一维数组的初始化
数组的初始化有七种情况。
(1)局部数组不初始化
对于普通局部数据,若定义时没有初始化,则数组中的元素值是不确定的。
(2)static 数组不初始化
对于static修饰的数组,若定义时没有初始化,则数组中的元素值默认为0。
(3)全局数组不初始化
对于全局数组,若定义时没有初始化,则数组中的元素值默认为0。
(4)全部初始化
与变量在定义时初始化一样,数组也可以在定义时进行初始化,如对整型数组进行初始化。
int a[10] = {1,2,3,4,5,6,7,8,9,10};
此处还要注意,数组只能通过下标逐个引用元素。定义数组时,对元素的初始化,只能写成一行,不能换行写,下边的写法是错误的:
int a[10];
a[10] = {1,2,3,4,5,6,7,8,9,10};
(5)部分初始化
数组在定义时,可以对其中的部分数据进行初始化。当“{}”中的值个数少于元素个数时,只给前面的部分元素赋值。例如,下面的定义就是对数组的前5个数据初始化,而后5个数据自动赋0。
int a[10] = {1,2,3,4,5};
(6)数组全部赋值
若想对数组中的全部元素赋值,则可以省略数组下标中的常量。编译器会自动根据初始化列表自动计算数组元素的个数,如下所示:
int a[] = {1,2,3,4,5,6,7,8};
(7)数组全部初始化为0
有一种很特殊的写法,可以一次性把数组中的元素全部初始化为0,只需要把这种写法当作特殊情况来记忆。示例代码如下:
int main()
{
int a[0] = {0};
return 0;
}
也可以引用库函数memset,把数组用0来填充,需要引入头文件string.h
#include <string>
int main()
{
int a[10];
memset(a, 0, sizeof(a));
return 0;
}
4.一维数组的内存分配
在内存中,数组元素占用连续的存储空间,并且根据单个元素所占存储空间来进行内存分配。数组名代表数组的起始地址,是地址常量,对数组名求sizeof,可以得出数组占用的总空间,类似的道理,很容易利用下面的表达式来计算数组的元素个数:
数组的元素个数 = sizeof(数组名) / sizeof(数据类型)