深入理解数组的定义和初始化

    数组是经常用到的一种内置复合类型,虽然如此,但是并不是每一个人都能熟悉数组的一些独特特性。下面就数组的定义和初始化的一些特性做一些探讨。


定义数组

    通常,定义一个数组,只需要写出数组类型、数组名、数组大小即可。这是每一个写程序的人都知道的。这里需要说明一点,数组的大小,不一定非得是整型字面值。我们可以在方括号中使用const变量常量表达式枚举
 

 
  1. const unsigned buf_size = 512;

  2. enum SizeType{zero, one, two, three, four};

  3. enum SizeType size = three;

  4. int data[buf_size]; //const变量

  5. int data2[3+5]; //常量表达式

  6. int data3[buf_size +1]; //含有const变量的常量表达式

  7. int data4[size]; //含有枚举

 

数组的初始化

    数组的初始化常常是一个被忽视的问题,而在实际编程中,数组初始化带来的bug是常有的且难以发现。因此,深入掌握数组初始化的细节,有助于编程能力和debug能的提升。

    数组如果没有显示地初始化,即在定义数组的时候,就给它们赋值,那么,定义出来的数组满足以下三点规则:     

  1. 定义在函数体外的数组,并且数组类型是内置类型,那么数组自动初始化为0.
  2. 定义在函数体内的数组,并且数组类型是内置类型,那么数组没有被初始化,这也是导致bug的一个来源。
  3. 不管数组在哪里定义,只要数组类型是一个自定义类,那么数组就会被默认构造函数初始化。

 

测试

 

下面对于上面提到的三条规则逐一测试验证。

规则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