深入理解数组的定义和初始化
2014-04-25 23:13
447 查看
数组是经常用到的一种内置复合类型,虽然如此,但是并不是每一个人都能熟悉数组的一些独特特性。下面就数组的定义和初始化的一些特性做一些探讨。
定义数组
通常,定义一个数组,只需要写出数组类型、数组名、数组大小即可。这是每一个写程序的人都知道的。这里需要说明一点,数组的大小,不一定非得是整型字面值。我们可以在方括号中使用const变量、常量表达式、枚举。
数组的初始化
数组的初始化常常是一个被忽视的问题,而在实际编程中,数组初始化带来的bug是常有的且难以发现。因此,深入掌握数组初始化的细节,有助于编程能力和debug能的提升。
数组如果没有显示地初始化,即在定义数组的时候,就给它们赋值,那么,定义出来的数组满足以下三点规则:
定义在函数体外的数组,并且数组类型是内置类型,那么数组自动初始化为0.
定义在函数体内的数组,并且数组类型是内置类型,那么数组没有被初始化,这也是导致bug的一个来源。
不管数组在哪里定义,只要数组类型是一个自定义类,那么数组就会被默认构造函数初始化。
测试
下面对于上面提到的三条规则逐一测试验证。
规则1:
按照前面提到的,我把数组定义在主函数外,并不给它赋值,然后在主函数中直接引用这个数组。我们写下如下测试代码
结果:
从运行结果来看,当把数组定义在主函数外,数组自动初始化为0。如果要定义的数组,初始化就是想让它为0,那么在函数体外定义的数组,可以不初始化。
规则2:
我们把数组的定义移到主函数内,并不显示地初始化。代码如下
结果:
从程序的运行结果来看,如果把数组定义到函数体内部,并且不进行显示的初始化,那么数组就没有被初始化。这个时候,数组元素的值是一些毫无意义的垃圾值。这种未初始化的数组,经常导致致命的bug。
规则3:
上面两个例子都是使用的系统内置的类型,接下来,我们来自定义一个类,并测试数组类型为自定义类型时的情形。
首先我们定义一个类MyClass,并分别把它放到函数体外和函数体内部,观察程序的输出。
结果:
从运行结果来看,无论把数组定义在哪里,并且没有显示地初始化,那么数组将会由默认构造函数来初始化。
定义数组
通常,定义一个数组,只需要写出数组类型、数组名、数组大小即可。这是每一个写程序的人都知道的。这里需要说明一点,数组的大小,不一定非得是整型字面值。我们可以在方括号中使用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; }
结果:
从运行结果来看,无论把数组定义在哪里,并且没有显示地初始化,那么数组将会由默认构造函数来初始化。
相关文章推荐
- 数组与字符串初始化为空的深入理解
- java数组的定义初始化关于内存的理解
- Java中数组表示1(一维数组的定义、初始化和内存中数组的表示)
- 关于结构体数组初始化的问题--深入举例
- c++ 深入理解数组
- 深入理解Oracle索引(5):反向索引的定义、缺点和适用场景
- 深入理解数组与指针——原因在于”退化“
- C++字符数组(定义和初始化、赋值和引用)
- JS定义数组、初始化
- C 语言字符数组的定义与初始化
- 深入理解PHP之数组(遍历顺序)
- 关于循环、数组定义的理解
- C 语言字符数组的定义与初始化
- 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量
- [黑马程序员]_数组定义、初始化及使用
- java数组初始化和定义
- 深入理解NumPy简明教程---数组1
- 第三章 3.5.1 定义和初始化内置数组
- C#二维数组的定义,初始化(重在理解两者的区别)
- 深入理解用mysql_fetch_row()以数组的形式返回查询结果