数组是常用的内置复杂类型,但并不是每个人都熟悉数组的独特特性。 讨论数组的定义和初始化的一些特性。
定义数组
通常,要定义数组,只需编写数组类型、数组名称和数组大小。 这是每个写程序的人都知道的。 请注意,数组的大小不一定必须是整数文字。 可以在方括号中使用const变量、常量表达式和枚举。
const unsigned buf_size=512; enum SizeType{zero,one,two,three,four}; enum SizeType size=three; int data[buf_size]; //const变量int data2[3 5]; //常数表达式int data3[buf_size 1]; 包含const变量的常量表达式int data4[size]; //包括枚举
初始化数组
数组初始化是一个经常被忽视的问题,但在实际编程中,数组初始化引起的错误很常见,很难发现。 因此,深入掌握数组初始化的细节有助于编程能力和调试能力的提高。
如果数组未显式初始化,也就是说,如果在定义数组时赋值,则定义的数组将满足以下三个规则:
如果定义函数外部的数组,并且数组类型为内置类型,则该数组将自动初始化为0。
如果数组是在函数中定义的数组,并且数组类型为内置类型,则未初始化数组也会导致错误。
无论数组的定义位置如何,如果数组类型是自定义类,则数组将使用默认构造函数进行初始化。
测试
接下来,我们将对以上三个规则逐一测试验证。
规则1:
如上所述,将数组定义在主函数之外,然后直接在主函数中引用该数组,而不赋值。 编写类似以下内容的测试代码
#include stdio.hint data[10]; int main () for ) intI=0; i10; I ) printf('%d ',data[i]; 返回0; }
结果:
根据执行结果,将数组定义在主函数之外时,数组会自动初始化为0。 如果定义的数组希望初始化为零,则在函数外部定义的数组可以不初始化。
规则2:
将数组定义移动到主函数内,初始化而不显示。 代码如下所示
# include stdio.hint main ((int data [ 10 ]; for(intI=0; i10; I ) printf('%d ',data[i]; 返回0; }
结果:
根据程序的执行结果,将数组定义到函数主体内部,并且不进行显示的初始化,数组就不会被初始化。 此时,数组元素的值是没有意义的垃圾值。 这种未初始化的数组经常会导致致命的错误。
规则3:
上面的两个示例是您的系统中的内置类型。 接下来,定义类并测试数组类型是否为自定义类型。
首先,定义MyClass类,并将每个类放在函数外部和函数体内部,然后观察程序的输出。
# include stdio.hclass myclass { intx; public:MyClass () printf (n将调用默认构造函数); this-x=3; }; MyClass outside[1]; int main () {MyClass inside[1]; 返回0; }
结果:
从执行结果来看,如果初始化数组而不显示数组,则无论数组定义在哪里,都会使用缺省构造函数初始化该数组。