数组初始化
初始化
给数组赋值的方法除了用赋值语句对数组元素逐个赋值外, 还可采用初始化赋值和动态赋值的方法。
数组初始化赋值是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。初始化赋值的一般形式为:
类型说明符 数组名[常量表达式] = { 值, 值……值 };
其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔。例如:
int a[10]={ 0,1,2,3,4,5,6,7,8,9 };
静态和自动初始化
数组初始化类似标量变量初始化的方式:也就是取决于它们的存储类型。存储于静态内存只初始化一次,也就是在程序开始之前,程序不需要执行指令将这些值放在合适的位置,因为它们一开始就在那里,这些是由链接器来完成的,它用可执行程序的文件中合适的值对数组元素进行初始化,如果数组未被初始化,数组元素的初始值将会自动设置为零。当这个文件载入到内存中准备执行时,初始化后的数组值和程序指令也一样被载入到内存中,因此当程序执行时,静态数组初始化已经完成。
对于自动变量而言,因为自动变量位于运行时堆栈中,执行流每次进入它们所在的代码块时,这类变量每次所处的存储位置可能并不相同。在程序开始之前,编译器没有办法对这些位置进行初始化,所以自动变量在缺省情况下是未初始化的。若是自动变量在声明中给出了初始值,每次当执行流进入自动变量声明所在的区域时,变量就被一条隐式的赋值语句初始化,这条隐式的赋值语句和普通的赋值语句一样需要空间和时间来执行,数组的问题在于初始化列表中可能有很多的值,那么初始化的时间将非常可观。
因而需要考虑,当数组的初始化位于一个函数(或代码块)时,每次对数组进行重新初始化是否值得,若答案是否定的,就要把数组声明成static形式,这样数组的初始化只需在程序开始前执行一次。
不完整的初始化
如下初始化:
int vector [5]={1,2,3,4,5,6};
int vector[5]={1,2,3};
已上两种情况,第一种情况的定义是错的,没有办法将6个整型值装到5个整型变量中。
但是第二种情况是合法的,它为数组的前三个值提供初始化,最后两个元素初始化为0。
自动计算数组长度
初始化:
int vector[]={1,2,3,4,5};
声明中如果未给出数组长度,编译器就把数组长度设置为刚好能够容纳所有的初始值的长度。
字符数组初始化
笨拙的方法:
char  message []={'H','e','l','l','o'};
快速的方法:
char  message []="Hello"
尽管这看上去是一个字符串常量,实际上并不是,它只是前面一个例子中的另一种写法,当用于初始化一个字符数组时,它就是一个初始化列表,在其它任何地方,它表示一个字符串常量:
如下:
char  message[]="Hello";
char *message2="Hello";
这两个初始化看上去很像,但是它们含义不同,前者初始化一个字符数组的元素,而后者是一个真正的字符串常量,这个指针变量被初始化为指向这个字符串常量的存储位置,如下图:


                
            
        
浙公网安备 33010602011771号