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

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


定义数组

    通常,定义一个数组,只需要写出数组类型、数组名、数组大小即可。这是每一个写程序的人都知道的。这里需要说明一点,数组的大小,不一定非得是整型字面值。我们可以在方括号中使用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能的提升。

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

  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;
}

结果:


从运行结果来看,无论把数组定义在哪里,并且没有显示地初始化,那么数组将会由默认构造函数来初始化。



  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值