首页 > 编程笔记 > C语言笔记 阅读:30

C语言一维数组的定义和使用(非常详细)

在 C 语言中,数组是按顺序存储的一系列类型相同的元素的集合,如 6 个整型的数值或 6 个字符型的字符。数组有一个数组名,通过整数编号访问数组中单独的项或元素。

C语言定义数组的标准形式如下:
元素类型 数组名[元素数量];
其中,元素数量必须是一个大于 0 的整数常量或正整数的常量表达式,元素类型可以是任意有效的 C语言数据类型。

例如有以下定义:
int month[6];
标识符 month 是一个内含 6 个元素的数组,每个元素都可以存储 int 型的值。数组的第 1 个元素是 month[0],第 2 个元素是 month[1],以此类推,直到 month[5],如下图所示,从逻辑上可以理解为每个元素为一行。


图 1 数组示意图

注意数组元素的编号从 0 开始,不是从 1 开始。

数组在内存中表现为一块连续的内存空间,数组名蕴含了这一段连续内存空间的开头位置的信息,表示程序在此次运行过程中数组在内存空间中的首地址,它是一个常量。

数组通常被用来存储程序所需要的数据,如存储 12 个月每月的天数。在这种情况下,在定义数组时就将数据存入数组比较好。

C语言可在定义数组时初始化数组,方法如下:
int main()
{
    int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
}
可以看到,通常用值列表(用大括号括起来)来初始化数组,各值之间用逗号分隔,在逗号和值之间可以使用空格。经过上面的初始化过程,程序将 31 赋给数组的首元素 month[0],以此类推。

如果初始化列表中的项数与数组的元素数量不一致会怎样?下面的实例演示了这种情况。
#include<stdio.h>

int main(void)
{
    int some_init[4]={20};

    printf("%s %s\n","i","some_init[i]");
    printf("%d %d\n",0,some_init[0]);
    printf("%d %d\n",1,some_init[1]);
    printf("%d %d\n",2,some_init[2]);
    printf("%d %d\n",3,some_init[3]);

    return 0;
}
程序编译后,可能的运行结果如下(也可能会有不同的输出结果):
i some_init[i]
0 20
1 0
2 0
3 0
由此可见,当初始化列表中的值少于数组的元素数量时,编译器会把剩余的元素都初始化为 0。如果初始化列表中的项数多于元素数量,编译器会直接报错。

其实,在声明数组时如果进行了数组的初始化,那么可以省略中括号里的数字,编译器会根据初始化列表中的项数来确定数组的大小:
int init[]={20,56,77,0}; //数组大小为4
声明数组后,可以借助数组编号给数组元素赋值。C 语言不允许把数组作为一个单元直接赋值给另一个数组,除初始化之外,也不允许使用花括号列表的形式赋值。

下面的实例演示了一些错误的赋值形式:
int main()
{
    int number[4]={1,7,2,8}; //初始化
    int copy[4];

    copy[3]=1; //可以
    copy[2]=number[1]; //可以
    //不能直接赋值   copy=number;
    //不能用花括号列表的形式赋值  copy={1,7,2,8};

    return 0;
}
在给数组元素赋值时需要注意一个陷阱:编译器不会检查数组的编号是否正确。下面的这种用法是不对的:
int month[12];
month[12]=3; //该元素不存在
month[20]=3; //该元素不存在
编译器并不会检查出这样的错误,但这样的代码会破坏程序的结果,甚至导致程序异常中断,所以在使用数组时注意编号不要越界,数组编号越界的严重性在于对数组元素的访问及修改的内容存在不确定性。

通常,使用循环来对数组元素进行各种操作。下面的实例使用 for 循环来处理数组,该程序要求计算 1~10 的和并求平均值。
#include<stdio.h>
#define loop 10

int main(void)
{
    int number[loop];
    int i,i_sum=0; //和的初始值必须为0
    float f_avg;

    for (i=0;i<loop;i++)
    {
        number[i]=i+1;
        printf("%d ",number[i]);
    }

    for (i=0;i<loop;i++)
        i_sum+=number[i];

    f_avg=(float)(i_sum)/ loop; //强制转换成浮点数,并相除
    printf("\nsum=%d average=%.2f\n",i_sum,f_avg);

    return 0;
}
编译运行,结果如下:

1 2 3 4 5 6 7 8 9 10
sum=55 average=5.50


【实例】输出前 10 个斐波那契数,每行输出 5 个。代码如下:
#include<stdio.h>
#define LOOP 10

int main()
{
    int i;
    int a[LOOP] = {1,1}; //只赋值前2个

    for(i = 2; i<LOOP; i++)
        a[i] = a[i-1] + a[i-2];
    //先遍历求出后LOOP-2个斐波那契数到数组

    for (i= 0; i <LOOP; i++)
    {
        printf("%10d", a[i]);
        if ((i+1) % 5 == 0) //i从0开始  所以加1除以5
           printf("\n");
    }

    return 0;
}
编译运行,结果如下:
1    1    2    3    5
8   13   21   34    55

相关文章