分析:如果直接输出未初始化的数组元素值,以观察未初始化的数组,实现方法代码如下所示:
#include<stdio.h>
#define SIZE 10
int main()
{
int array[SIZE] ;
int i = 0;
for(i = 0;i < SIZE; i++)
{
printf("arry[%d] = %d\n",i,array[i]);
}
return 0;
}
运行结果如下:
对于输出结果,可能大多数初学的人可能不懂。所以,为了数据安全,对数组也必须初始化。
分析 : 由于数组未初始化,各元素的值十分紊乱。其内存内容为编译器分配内存前的原始状态,因此,里面存放的是你不可能知道的数据。从程序输出的结果中也可以看到,未经初始化的数组中元素的数值都是混乱的。若在这时使用这些数组元素,将会导致一些不可预知的问题(严重的甚至导致系统瘫痪)。因此,为了避免出现一些不必要的错误,数组一经定义,最好立即对数组进行初始化。
数组的初始化,就是定义数组变量的同时给其中的数组元素赋值,由于是给多个元素同时赋值,因此,形式上与单个变量赋值有所不同。主要有一下三种形势。
形势一
对数组中的所有元素分别单独赋值,把初始化值按序列依次放在花括号中,并使用逗号隔开,实现对数组各个元素的赋值,形式如下:
数据类型 数组名[N] ={值0,值1,值2,……值(n-1)};
花括号内的最后一个值后,也可以跟一个逗号,形式如下:
数据类型 数组名[N] ={值0,值1,值2,……值(n-1),};
其中,花括号内的值0赋值给数组的第一个元素,值1赋值给第二个元素,……值(N-1)赋值给第N个元素。例如:
int hours[12]={123456789101112};
也可以在最后一个元素后面跟一个逗号,形式如下:
int hours[12]={1,2,3,4,5,6,7,8,9,10,11,12};/*最后一个值后也可以跟逗号,这个 有点不美观,不推荐*/
执行初始化后,花括号内值序列依次赋值给hours的元素,hours[0]为1,hours[1]为2,
hours[2]为3,hours[3]为4,hours[4]为5,hours[5]为6,hours[6]为7,hours[7]为8,hours[8]为9,hours[9]为10,hours[10]为11,hours[1]为12。
同时,初始化的数值序列不能大于数组容量。例如:
int year[4]={356,355,355,355,356};
由于将五个数值赋值只能保存四个元素的数组变量,所以编译器会报错:”two many initializers”(太多初始值)。
形式二
也可以只给数组的部分元素赋值,编译器会自动把剩余元素的内存空间初始化为0,如果类型是int型,为0,如果为浮点型,则赋值为0.000000。标准形式如下:
数据类型 数组名[N] ={值0,值1,值2,……值n};/*其中n<N-1*/
其中,数组的第一个到第N个元素会被依次初始化为值0到值n,剩余的元素会被初始化为0。实例如下:
int door [6]={1,2,3};
初始化后,数组door的结果为:door [0]=1,door [1]=2,door [2]=3,door [4]=0,door [5]=0,door [6]=0.需要注意的是:被初始化的数组元素部分必须是数组中从第二个元素开始的连续序列。例如,以下语句是错误的:
int window[6]={1,,3,4,5};/*第二个元素未赋值*/
int window[6]={,,,3};/*第一个和第二个元素为赋值*/
大部分的时候,初始化的值并无特殊意义,只是为了防止出现意外的数值。这种情况下,一般会将变量初始化为0或0.0。而对于这种情况下的数组初始化,可以用编译器的自动初始化的特性来简化初始化值序列。例如:
int mouth [12]={0};
double degree[12] = {0.0};
char ip[16] = {0};
形式三
初始化数组时,还可以在定义中不给出容量大小,即让容量大小由初始化值序列的个数决定。一般情况下,这是可行但不推荐的方法。其形式如下:
char font[] = {'a','b','c','d','e','f','g'};
由于初始化值序列有7个char型值,因此,数组font的容量为7。上面介绍了三种数组初始化的三种形式,下面来验证初始化的结果。实现方法代码如下:
#include<stdio.h>
#define SIZE 5
int main()
{
int arry1[SIZE] = {1,2,3,4,5}; //定义并初始化数组arry1
int arry2[SIZE] = {0}; //定义并初始化数组arry2
int arry3[] = {11,22,33,44,55}; //定义并初始化数组arry3
int i = 0;
int j = 0;
int k = 0;
for(i=0;i < SIZE; i++)
{
printf("arry1[%d]=%2d ",i,arry1[i]); //输出arry1的值
}
printf("\n");
for( j = 0;j < SIZE; j++)
{
printf("arry2[%d]=%2d ",j,arry2[j]); //输出arry2的值
}
printf("\n");
for( k = 0;k < SIZE; k++)
{
printf("arry3[%d]=%2d ",k,arry3[k]); //输出arry3的值
}
printf("\n");
return;
}
运行结果:
代码分析
● 第六行,定义并初始化数组arry2,对arry2初始化序列只包含一个整型数值0,其余的元素由编译器自动赋值0。初始化后,数组元素如上述运行结果第二行所示。
● 第11~24行,使用三个循环分别将三个数组的内容输出。
● 第21行,可以改为for(k = 0;k < sizeof(array3)/sizeof(array3[ k ]); k++);
● 第23行,printf( ” array3[ %d ] = %2d ” , k,array3[ k ]);
上例中第三个数组通过17,18行代码输出,其中,检测数组大小用了 sizeof(array3)/sizeof(array3[ k ],它表示数组 array3所占字节/一个整型数字所占的字节数,其相除结果也就是数组元素的个数,sizeof()对于其他类型的数据也同样适用。