大家好
欢迎回来继续学习
C++语言程序设计
这一节
我给大家介绍
数组的存储与初始化
那么一维数组的存储呢
它是在内存中
按次序存放的
元素与元素之间
它的地址是连续的
也就是说
是通过元素之间
物理地址上的相邻关系
来体现出
数组元素逻辑次序上的相邻关系
我们看这样一个例子
这个示意图
比如说我们定义了一个数组a
那么数组a里面的各个元素
在内存中它是怎么存放的呢
它就一个挨一个
这么连续存放的
中间不会有空档字节
那数组名
其实就是数组元素的首地址
也就是
这一组元素它的起始地址
所以说呢
一旦你定义好一个数组以后
数组名它就是一个常量了
一个地址类型的常量
还有地址类型吗
我们前面学过的那么多
数据类型里面
没有包括地址类型
在这一章稍后
我们就会学习地址类型
其实也就是叫做指针类型
那么a里面呢
这个数组名a里面
存放的就是一个常量
就是数组的起始地址
所以我们要很小心
千万不要试图给数组名
重新赋值
因为它是常量
它存着数组的起始地址
是不可改变的
所以也是不可以重新被赋值的
接下来呢
我们来学习
如何对一维数组进行初始化
对数组初始化
也就是说
我们在定义数组的时候
要给予它初始值
我们来看一维数组初始化
可以有这样几种方式
第一种方式
是列出全部元素的初始值
看看在这个数组定义之后呢
写一个等于号
然后在一对大括号中
用逗号分隔
列出了这个数组的
全部十个元素的初始值
那我们如果说
不想给全部的元素赋初始值
只想给一部分元素初始化
是不是可以呢
也可以
我们看第二个
是只给一部分元素初始化的情况
这里只列出了
前五个元素的初始值
如果我们已经列出了
全部元素的初始值呢
那就可以不指定数组的长度了
所以在第三种情况我们看
定义一个数组的时候
给出了全部的元素初始值
所以方括号里面的元素个数
也就是下标个数
就可以不写了
这时候编译器呢
会按照你给出的初始值个数
去确定数组元素的个数
接下来
我们再来学习
二维数组的存储
看看二维数组在内存中
它是怎么存储的呢
它也是依次连续存储的
实际上我们可以将二维数组
理解成
由一维数组构成的数组
我们看这个示意图
比如说
我们定义一个
float类型的二维数组a
它有三行四列
那么每一行呢
都可以看作是一个一维数组
我们知道
如果你要访问一个
二维数组的元素
那数组名之后
应该有两个方括号下标
指出它的行下标和列下标
你才能定位到一个具体的元素
但是现在如果我们只写一个下标
只写第一维的下标
那表示什么呢
如果我们只写a[0]的话
那就表示0行的首地址
我们写a[1]
就表示一行的首地址
a[2]表示二行的首地址
所以呢
a[0] a[1] a[2]
它本身又是地址
它是行的首地址
那么一个二维数组
实际上就是由一维数组这些行
构成的数组
这样我们就不难理解
二维数组在内存中的存放形式
是什么呢
是按行存储
具体到这个例子
它是先存储零行
再存储一行
再存储二行
这样依次存储的
那么如果是多维数组呢
就依此类推
对于二维数组
在定义的时候
我们能不能也给它的元素
设置初始值呢
也可以
这就是二维数组的初始化问题
我们来看
我们对二维数组
进行初始化的时候
也是可以有这样几种方式
一种呢
是列出全部的初始值
列出全部初始值的时候
那么编译器
就会按照你定义的行列结构
以及全部的初始值
将这些值
按照一行一行的次序
依次对应上去
如果列出来的全部初始值
就这么平铺直叙地列在这儿
那显然看起来就不那么直观
虽然对于编译器来说
这个无所谓的
它不会对应错
但是对于我们人
程序员自己看起来
就不那么清楚了
所以我们还可以对它进行分组
在大括号之内
按照行
每行一组
再用大括号给它界定起来
给它包括起来
这样的话
不仅看起来一目了然
比较清楚
而且可以用这种方式
只给部分元素进行初始化
我们知道不管是几维数组
你在这种初始化列表中
列出所有的初始值
进行初始化的时候
你必须连续列出元素的初始值
虽然你可以只给前若干个元素
指定初始值
但是你不能跳跃着
我给一三五七个元素指定初始值
那是不可以的
这样的话
如果
对二维数组进行初始化的时候
我们不想给出所有初始值
而是想比如说
给出零行的首元素初始值
一行的前两个元素初始值
二行的前三个元素初始值
那么
对于整个一个初始化序列来说
它中间是空掉了很多
因为它按行初始化
首先你零行的首元素有初始值了
那后面几个元素没有初始值
那就跳过去了
如果你只给一个
不分组的初始化列表的话
初始值列表的话
那你是不能跳跃着给初始值的
不能有空的逗号
但是如果你对它进行分组了
你就可以在每一组中
只给前若干元素指定初始值
这样我们就达到了
给各个行的前若干元素
指定初始值的这样的效果
还有呢
如果你在初始化的时候
列出了全部的初始值
下标的个数也有可以省略的地方
但是二维数组
你不能把两个维的下标个数
都省略了
那你说我有十二个初始值
两个下标个数我都不写
那编译器真的不知道
你想是哪一维是几个下标了
所以语法规定呢
是第一维的下标个数可以不写
所以呢
那个三行四列
第一三我们就可以不写了
实际上呢
我们有的时候定义数组
会不介意它的初始值
因为事后可能马上就从
键盘去读入数据了
或者从文件读入数据了
或者就是用它来存储
某一个计算的结果
所以不介意它的初始值
所以有的时候确实
我们程序员会定义数组
但是不给它初始化
如果定义一个数组的时候
不给它进行初始化
它的初始值会是什么呢
如果是一个局部作用域里面的
非静态数组
那么不初始化的话
它的初始值就是垃圾数据
不可靠的
不可使用的
如果像我们这几个例子里面
列出来的
是静态数组
那不初始化它的话
数值型的数据会默认初始化为0
如果你只对数组的一部分元素
进行初始化
比如说对它前若干元素
进行初始化
那剩下没初始化那些元素
会是什么呢
都会自动初始化为0
现在我们来看一个
用数组来存放
Fibonacci数列的例子
这个例题呢
也是一个典型的结合数组
和循环来使用的例题
求Fibonacci数列的前20项和
将结果存放于数组中
我们知道Fibonacci数列
它每一项是前两项之和
所以数列的这些项之间
依次变化的规律
是固定的
既然我们知道了
这个依次变化的规律
我们就可以用for循环
依次处理数组的各个元素
也就是依次求出
这个数列的各个项
那由于每一项是前两项之和
所以我们应该首先
在定义数组的时候
就把它最开头的两个项
做好初始化
分别初始化下标为0
和1的这两个数
这两个元素都是1
那接下来呢
我们这个for循环呢
从数组下标等于2的地方开始
然后控制它到小于20的地方
因为前20项
最大下标是19
那么在这个for循环的循环体中
就是用前两项之和
求得当前下标为i的这一项
每次做完循环以后
这个循环控制变量
也就是数组的下标要增1
求完了数列前20项的和
放到数组里面以后呢
接下来我们就要输出数组
同样适合用循环来输出
依次处理数组的各个元素
那么这里呢
我们希望输出结果呢
每五个一换行
所以在for循环中
配合了一个if选择结构
当i除以5余数为0的时候
就输出一个换行
另外我们设置
每一项的输出宽度为12
这样的话就对得比较整齐
最后输出每一个f[i]
就是数组的元素
也就是
这个Fibonacci数列的各个项