数组是经常用到的一种内置复合类型,虽然如此,但是并不是每一个人都能熟悉数组的一些独特特性。下面就数组的定义和初始化的一些特性做一些探讨。
定义数组
通常,定义一个数组,只需要写出数组类型、数组名、数组大小即可。这是每一个写程序的人都知道的。这里需要说明一点,数组的大小,不一定非得是整型字面值。我们可以在方括号中使用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]; //含有枚举
数组的初始化
数组的初始化常常是一个被忽视的问题,而在实际编程中,数组初始化带来的bug是常有的且难以发现。因此,深入掌握数组初始化的细节,有助于编程能力和debug能的提升。
数组如果没有显示地初始化,即在定义数组的时候,就给它们赋值,那么,定义出来的数组满足以下三点规则:
- 定义在函数体外的数组,并且数组类型是内置类型,那么数组自动初始化为0.
- 定义在函数体内的数组,并且数组类型是内置类型,那么数组没有被初始化,这也是导致bug的一个来源。
- 不管数组在哪里定义,只要数组类型是一个自定义类,那么数组就会被默认构造函数初始化。
测试
下面对于上面提到的三条规则逐一测试验证。
规则1:
按照前面提到的,我把数组定义在主函数外,并不给它赋值,然后在主函数中直接引用这个数组。我们写下如下测试代码
#include <stdio.h>
int data[10];
int main()
{
for(int i=0; i<10; ++i)
printf("%d ",data[i]);
return 0;
}
结果:
从运行结果来看,当把数组定义在主函数外,数组自动初始化为0。如果要定义的数组,初始化就是想让它为0,那么在函数体外定义的数组,可以不初始化。
规则2:
我们把数组的定义移到主函数内,并不显示地初始化。代码如下
#include <stdio.h>
int main()
{
int data[10];
for(int i=0; i<10; ++i)
printf("%d ",data[i]);
return 0;
}
结果:
从程序的运行结果来看,如果把数组定义到函数体内部,并且不进行显示的初始化,那么数组就没有被初始化。这个时候,数组元素的值是一些毫无意义的垃圾值。这种未初始化的数组,经常导致致命的bug。
规则3:
上面两个例子都是使用的系统内置的类型,接下来,我们来自定义一个类,并测试数组类型为自定义类型时的情形。
首先我们定义一个类MyClass,并分别把它放到函数体外和函数体内部,观察程序的
#include <stdio.h>
class MyClass
{
int x;
public:
MyClass()
{
printf("\n默认构造函数被调用");
this->x = 3;
}
};
MyClass outside[1];
int main()
{
MyClass inside[1];
return 0;
}
结果:
从运行结果来看,无论把数组定义在哪里,并且没有显示地初始化,那么数组将会由默认构造函数来初始化。
文章来源: https://blog.csdn.net/tiredoy/article/details/24497569