正像以前我说过的,我已经不下五次“以为”我理解数组了,然而今天又一次发现自己无知。
初学C的时候我把数组当成指针看。明白了一些实现机制后,我开始把数组当成一个特殊的变量; 我开始察看汇编剖析原理,理解逐步深入。 可是,明白得越多,就会发现越多的特例。 最终 —— 我陷入了看似任意且繁杂的规则的迷宫。
还是的回到定义上来。C/C++的数组保证两件事:
1 数组是由同类型成员组成的构造对象,占有一块连续的内存。
2 它的名称表示它的首地址。
仅此而已,除此之外 —— 任何内容都不属于数组的定义。
所以,我们知道,当我们需要数组的时候,我们定义就是了。需要静态数组? C在静态区给你一个数组。 需要自动数组? C在栈上给你一个数组。它还会自动给你初始化:
char str [] = "It's convenient to use arrays";
于是栈上有了我们需要的、不折不扣刚好30字节的空间,当我们用str索引他的时候,他已经有需要的内容了。 这就是C/C++。他选取了最精确的定义,而隐藏繁杂的后台。一切都有可能改变,唯有概念不变。
ANSI C++98太厚了, 一时还没法学会在里面找到自己要东西。下面是我的一些总结:
1 首先谈谈函数内定义的普通数组,即auto数组。 auto 数组的的确确实在栈上建立的,且(可以认为)在定义的位置初始化。 所以,若你希望用一个数组实现一个颇大的正弦速查表,推荐还是改用指针 —— 系统切切实实会在栈上初始化一个结结实实的巨大 auto 数组。
auto数组在离开作用域后,其内存就被回收了 —— 按照C的说法,你不应该继续用它了。这的确就是我们编写程序需要用到的所有知识 —— 不过,若想刨根问底,稍候,我也会谈到这是一个怎么样的内部过程。
2 static 数组是怎么回事呢?
C和C++中有很多 static 。 可以说,每种 static 都不是一回事。
static 数组都存储在静态数据域中。这里要细谈的是局部 static 数组的初始化:
局部static对象当你第一次用的时候初始化;主程序结束时,所有初始化过的局部static 对象按和构造相反的顺序析构 —— 然后全局对象才开始析构。