C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
数组的声明并不是声明一个个单独的变量,比如 number0、number1、…、number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]、numbers[1]、…、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引(下标)访问。
所有的数组都是由连续的内存位置组成。最低的地址对应第一个数组元素,最高的地址对应最后一个数组元素。
数组元素是组成数组的基本单元。数组元素也是一种变量, 其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。数组元素通常也称为下标变量。必须先定义数组, 才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。
声明数组
在 C 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:
type arrayName [ arraySize ];
这叫做一维数组。arraySize 必须是一个大于零的整数常量,type 可以是任意有效的 C 数据类型。
例如,要声明一个类型为 double 的包含 10 个元素的数组 balance,声明语句如下:
double balance[10];
现在 balance 是一个可用的数组,可以容纳 10 个类型为 double 的数字。
a[5];
a[i+j];
a[i++];
初始化数组
在 C 中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。
如果您省略掉了数组的大小,数组的大小则为初始化时元素的个数。
因此,如果:
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
您将创建一个数组,它与前一个实例中所创建的数组是完全相同的。
下面是一个为数组中某个元素赋值的实例:
balance[4] = 50.0;
上述的语句把数组中第五个元素的值赋为 50.0。所有的数组都是以 0 作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去 1。
以下是上面所讨论的数组的的图形表示:
C语言对数组的初始化赋值还有以下几点规定:
- 1) 可以只给部分元素赋初值
当{ }中值的个数少于元素个数时,只 给前面部分元素赋值。
例如:int a[10]={0,1,2,3,4};
表示只给 a[0]~a[4]5 个元素赋值,而后 5 个元素自动赋 0 值。
- 2) 只能给元素逐个赋值,不能给数组整体赋值
例如给十个元素全部赋 1 值,只能写为:int a[10]={1,1,1,1,1,1,1,1,1,1};
而不能写为:
int a[10]=1;
- 3) 如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。
例如:int a[5]={1,2,3,4,5};
可写为:
int a[]={1,2,3,4,5};
访问数组元素
数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。例如:
double salary = balance[9];
上面的语句将把数组中第 10 个元素的值赋给 salary 变量。
例1.数组的赋值和数组元素的访问
#include <stdio.h> int main () { int n[ 10 ]; /* n is an array of 10 integers */ int i,j; /* initialize elements of array n to 0 */ for ( i = 0; i < 10; i++ ) { n[ i ] = i + 100; /* set element at location i to i + 100 */ } /* output each array elements value */ for (j = 0; j < 10; j++ ) { printf("Element[%d] = %d\n", j, n[j] ); } return 0; }
数组类型说明应注意以下几点
1) 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
2) 数组名的书写规则应符合标识符的书写规定。
3) 数组名不能与其它变量名相同。
例如:
main()
{
int a;
float a[10];
……
}
是错误的。
4) 方括号中常量表达式表示数组元素的个数,如 a[5]表示数组 a 有 5 个元素。
但是其下标从 0 开始计算。因此 5 个元素分别为 a[0],a[1],a[2],a[3],a[4]。
5) 不能在方括号中用变量来表示元素的个数, 但是可以是符号常数或常量表达式。
例如:
#define FD 5
main()
{
int a[3+2],b[7+FD];
……
}
是合法的。
但是下述说明方式是错误的。
main()
{
int n=5;
int a[n];
……
}
6) 允许在同一个类型说明中,说明多个数组和多个变量。
例如:
int a,b,c,d,k1[10],k2[20];
可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合 scanf 函数逐个对数组元素赋值。
如下例所示
例2.利用scanf函数对数组进行赋值并求出最大值
main()
{
int i,max,a[10];
printf("input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
max=a[0];
for(i=1;i<10;i++)
if(a[i]>max) max=a[i];
printf("maxmum=%d\n",max);
}
- 本例程序中第一个 for 语句逐个输入 10 个数到数组 a 中。 然后把 a[0]送入 max 中;
- 在第二个 for 语句中,从 a[1]到 a[9]逐个与 max 中的内容比较,若比 max 的值大,则把该下标变量送入 max 中,因此 max 总是在已比较过的下标变量中为最大者;
- 比较结束,输出max 的值。
例3.输入十个整数,按从大到小顺序排列
[content_control]
main() { int i,j,p,q,s,a[10]; printf("\n input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++) { p=i;q=a[i]; for(j=i+1;j<10;j++) if(q<a[j]) { p=j;q=a[j]; } if(i!=p) { s=a[i]; a[i]=a[p]; a[p]=s; } printf("%d\t",a[i]); } }
本例程序中用了两个并列的 for 循环语句,在第二个 for 语句中又嵌套了一个循环语句。第一个 for 语句用于输入 10 个元素的初值。
第二个 for 语句用于排序。本程序的排序采用逐个比较的方法进行。在 i 次循环时,把第一个元素的下标 i 赋于 p,而把该下标变量值 a[i]赋于 q。然后进入小循环,从 a[i+1]起到最后一个元素止逐个与 a[i]作比较,有比a[i]大者则将其下标送 p,元素值送 q。
一次循环结束后,p 即为最大元素的下标,q 则为该元素值。若此时 i≠p,说明 p,q 值均已不是进入小循环之前所赋之值,则交换 a[i]和 a[p]之值。
此时 a[i]为已排序完毕的元素。输出该值之后转入下一次循环。对 i+1 以后各个元素排序。
[/content_control]
例4.计算用户输入数据的平均值
// Program to find the average of n numbers using arrays #include <stdio.h> int main() { int marks[10], i, n, sum = 0, average; printf("Enter number of elements: "); scanf("%d", &n); for(i=0; i < n; ++i) { printf("Enter number%d: ",i+1); scanf("%d", &marks[i]); // adding integers entered by the user to the sum variable sum += marks[i]; } average = sum / n; printf("Average = %d", average); return 0; }
结果
Enter n: 5
Enter number1: 45
Enter number2: 35
Enter number3: 38
Enter number4: 31
Enter number5: 49
Average = 39