sy_ycdm

C语言基础教程:数组的赋值

c数组的赋值分为赋初值和赋值两种。赋初值又称为初始化,是在编译时进行的,故不占用运行时间。赋值是用赋值表达式语句,在运行时间进行的。二者虽然都可使数组元素获得所需要的值,但是就其方法和时间是不同的。

1.数组的斌初值

数组被赋初值不是所有数组都可做到的。C语言规定:只有静态存储类(static)和外部存储类(extern)的数组才能被赋初值。

赋初值的方法是使用一种称为初始值表的方法。该方法是在定义或说明数组时用一对花括号将要赋给数组各元素的值括起来,按其顺序赋给该数组。

对一维数组赋初值方法如下:

static}int a[5]一}{5,4,3,2,1};

经过这样的初始化后,使得数组a的s个元素(按顺序)分别获得的值是:},4.},2,1a即a[0]获得5,a[4]获得1.用这种办法也可以使一个数组中的某些元素获值,例如,

Static int b[8],3,5,7,9}

这里,数组b的8个元素中,前面的5个元素b[0],b[1],b[2],b[3],b[4]分别获得的便为1,3,5,7和9.而b数组中b[5},b[6},b[7]这三个元素没有被赋初值。

在使用初始值表的方法赋初值时,需要注意的是要使初始值表中数据项的个数小于或等而不得大于待初始化的数组元素的个数,这就保证了在给数组赋初值FI,, .不会使数组产生越界。为了使得初始表中的所有数据项正好赋给待初始化的数组元素,可在初始化时不给定数组的大小。例如:

int m[]=1{1.2.3.4.5}

等价于

int m[5]={1,2,3,4,5};

在省略数组大小时,系统将会根据初始值表中数据项的多少来自动确定数组的大小,在上例中,由于数据项为5,因此,数组的大小也为5,如果用初始值表给一个数组中的-部分元素赋值时,待初始化的数组大小就不能省略。例如,

static int a[8]={i,2,3,6};

这里,数组a的大小8就不能省略。上述语句将给数组a的前4个元素斌了勿值,而后几个元素没有赋初值,即保持其缺省值,皆为0.

对二维数组赋初值方法如下:

二维数组赋初值的原则与一维数组相同,同样要求初始值表中数据项的个数要小于或等于待初始化的数组元素的个数。使用初始值表进行赋初值就是使得待初始化的数组中的全部或部分元素按其顺序从初始值表中对应项获取值。例如,

int a[2][3]={1,2 .3,4,5,6};

表示数组a的6个元素按其内存存放顺序依次获得1,2,3,4,5,各值。对二维数组也可以按行初始化。例如,

int a[2][3]=(1,2,3},{4,5,6};

在初始值表中,对每一行所对应的数据项用一个花括号括起来,这样看起来比较直观,该例中,将{1,2,3}给第一行的3个元素,再将(4,5,6)赋给第二行的3个元素。

也可以对二维数组的部分元家进行初始化;例如,

int b[3][4]={1,2,3};

表示对数组b的前3个元素b[0][0],b[0][1]和b[0][2]赋初值分别为1,2,3又例如

int b[3][4]={(1),(2),(3)};

表示对数组b的每一行的首元素赋初值,即对b[0][0]赋初值为1,对b[1][0]赋初值为2,对b[2][0]赋初值为3.而数组b的其余9个元素都为缺省值0:又例如,

int b[3][4]={(),(0,1)(1,2,3);

表示对数组b的第一行不赋初值,对第二行的b[1][1]和b[0][1]别赋初值为0和1,对第三行的b[2][o],b[2][1],b[2][2]分别赋初值为1,2和3,数组b的其余元素值为0

如果对二维数组的全部元素用初始值表进行赋初值时,则所定义的数组的第一维的太小可以不指定,但是第二维的大小必须指定。例如,

int b[][3]={1,2,3,4,5,6}

系统将会计算出数组b的第一维的大小是2,并自动确定。

对三维数组的初始化的方法同于前面所述,不再重复,仅举一例,例如,

int c{2}[3]〔4]={{{1,2,3,4},{5;6,7,8}(9,10,11,12}},{13,14,15,16} {17,18,19,20),{21,22,23,24}}}}

等价于intc[2][3][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,2021,22,23,24};

关于部分元素的赋值方法和省略数组第一维大小的方法与二维数组相同。

2.数组的赋值

数组的赋值,实际卜是对数组的各个元素的赋值。对数组的各个元素赋值可通过赋值表达式语句进行。例如,

int a [5],b[2][3〕;

a[0]=a,1]=n[2]=1

a[3]=a,4]=2

b[0」[0]=3;

b[0][3]=4.

……

对数组的赋值也可采用循环的方法,关于循环语句将在后面会讲解。例如,

for(i=0; i<5;i++)

a「i]=i+1

表示对数组a的5个元素分别赋值为1,2,3,4和5.

同样,对二维数组赋值可采用二重循环。值得说明的是采用循环的办法赋值要求数组元值之间存在某种可使用循环的关系。关于二、三维数组用循环赋值的例子将会在后面的程序中着到,这里不再举例。

这里需要说明的是不能用初始值表的方法给数组赋值。下面作法是错误的。

Inta[5];

a={1,2,3,4,5};

给数组赋值只能是对数组的各个元素赋值。

[例2. 7]一维数组的赋值和引用。

main ()

static inta[5]={9,7,5,3};

a[2]-=10;

print!(” % d,%d,%d\n .a[0],a[2],a[4]〕;

执行该程序输出结果如下:

9,10,0

因为通过对数组a的初始化,使a[o]9,a([2]为5,a[4]为缺省值0.又经过对a[2]的赋值,将a[2]的值改变为10,所以,输出的如上的结果。

[例2. 8]

main()

{

二维数组的赋值和引用。

int i,s=0;

static int b[3][3]={{6},{7,8}};

forCi=U;i!3;i十十)

b[2][i]=i+1

for(i=O;i<3;i十十)

5十=b[i][i]

printf (”%d\n”; ,s);

}

执行该程序输出结果如下:

17

因为该程序中,通过对数组b赋初值使得b[0][0]获值为6,b[1][0]获值为7,b[1][1]获值为8,其余元素为0.再通过程序中的循环赋值使得b[2][0]获值为1,b[2][1]获值为2,b[2][2]获值为3.程序再使用一次for循环,求得二维数组的主对角线各元素之和,这时b[0][0]为6,b[1][1]为8,b([2][2]为3,所以求和为17.于是,输出该和s的值为17。

评论