好,各位同学,在我们理性认识C程序这一部分的最后
我们专门拿出一段时间来专门说一下数组。会有同学可能要问了。
为什么单单拿出数组来讲一讲呢?原因非常的简单,那是因为数组是我们最常用的
一种数据结构,也是到目前为止我们所学过的最复杂的一种数据结构。那么关于数组的使用呢
还有一些事情想要告诉大家。所以说我们专门拿出一段时间来说一下数组。首先我们来回顾一下数组
的定义。关于数组的定义大家都已经非常的熟悉了。
那么写一个变量名在前头给数组起个名字,然后在这写一个常量表达式
好那就定义了一个数组了。拿这儿需要说明的就是数组的名字也是跟我们以前讲过的标识符,它的定义方式是一样的。
就是必须以下划线或者是字母开头,其它的都不行。
这儿再啰嗦一句,无论我们在什么时候定义数组我们都
一定要注意下标的问题。比方说我们定义10个元素的一个数组,那么它的下标
是从0开始,一直到9,那就是一个任何时刻都必须要注意的事情。
因为在写成这个过程中非常容易犯错误。ok这就是数组的定义。那么关于数组的定义呢,我们补充几点说明。
我们首先来看一个例子。在写程序的时候
我们时常碰到这样的情况,在我们定义一个数组的时候
我们并不一定能确切的知道这个数组应该有多大,当然最合适的大小是既不浪费又不能产生
不够用,但是我们很多时候都不知道一个数组该多大。所以在这种情况下我们通常的做法
是定义一个足够大的一个数组,对吧?有的同学觉得这有点浪费,那我能不能定义一个
长度可变的一个数组呢?比方说在这个程序里头我就先定义了一个变量N
然后呢我把数组的大小只定义成变量N。那么这样做在C++里头允许不允许呢?
非常明确这种情况是不允许的,在C++里头。
因为在数组的定义里头这个地方必须要出现一个
常量表达式,必须是一个常量表达式。但是有的同学说我还是
很想把数组的大小约定下来,比方说我在写一个程学的时候,一开始我就定义了一个数组的大小
我底下for循环语句我都是按那个大小去写的,如果这个数组的大小后面又发生改变的话
那么所有的语句我都需要改,至少让我改一个地方就能把数组的大小给改了在这个程序里头。
OK有这个需求很好,我们提供两个办法,第一个办法,你可以写一个这样的程序。
看一下现在这一个程序跟刚才那个程序有什么不同。在这儿呢我仍然定义了一个
看上去好似变量的一个标识符I,那有些同学这样做行不行呢?
标识符i在这儿定义的是一个什么?我们以前讲过,这个叫做符号常量。
Constant
int,i,它是一个符号常量。这样呢定义一个i,然后把这一个i写在这里。
那么在以后的所有的程序里头只要提到数组的大小的我都可以使用这个i来代替。
如果我发现我的程序写着写着这个数组的大小应该变一下啦,都不够用了,那怎么办呢?我只需要改
这一个数字就可以了。const i 后面所赋的这一个数值就可以了。当然首先要说明的是
这种方式不是说定义了一个可变长段数组,那么在我们这个课上所学的这个C语言里头
是不支持变长数组的,那么通过这种方式呢我们可以指程序的修改变得简单一些。
出了这种方式之外还有一种方式,就是说如果我不想在这里定义一个符号常量
那么你可以使用这种方式。看这个程序,这个程序看上去有点
跟以前的不一样了。它的改变出现在这,以井号(#)开始写了一个define
N 4,那么这句话呢出现在 main函数的前头,并且以井号(#)开头,这属于程序的预定义部分。
预定义部分。那么在这个部分呢我们可以定义一个标识符
N,这句话的含义就是这样的,就是在这个程序里头我定义了一个N。
在程序的任何一个地方只要碰到N我就可以把它当作4来看待。
这就是一个define N 4 的含义。比如说我定义了一个标识符N
它的含义跟4是一样的,用一个通俗一点的词就是说
给4这个字面常量定义了一个马甲。
这个马甲呢名字就叫做N。那么只要在以后的程序里头见到了大N,无论它出现在
什么地方,我都把这个大N当作4来看待,这就是这个
程序的这个含义。通过这种方式我们也可以实现
对数组大小的一个比较方便的修改。那么这是关于数组的定义我们想要补充给
大家的。那么在我们定义完一个数组之后呢通常我们要对数组进行初始化。
比方说我定义了一个数组a[10],把所有的元素
列举出来,那么这个定义过后呢我们就可以得到一个这样的数组了。
包括10个元素,然后每个元素都赋好了值,那么这个呢是数组的初始化的最基本的方法。
那么关于数组的初始化在这儿我们也有几点想要告诉大家的。
第一,一个数组能不能不去初始化?比方说在这个数组里头我定义了一个数组。
a[4],但是呢我没有对它进行任何的初始化,然后呢我就把它的各个元素打印出来。
你们觉得会打印出什么东西来?这个情况就很类似于我们以前讲过的
整数的定义了,因为这里头每一个元素都是一个整形的元素。
然后整形的元素不仅仅就是花了所得到的结果或是什么来着,然后是一个
这样的结果。每一个都是一个非常大的一个负数。
每一个都是一个非常大的负数。有同学可能要问了,那为什么是这样的一个数呢?那是因为在
VC底下对于一个没有进行任何初始化的一个整数
那么程序呢自动的给它赋一个初始的值。
赋这个值的目的就是为了对程序的安全性进行一个保护,以后讲到指针的部分
我们还会提及这一个问题。OK这是不进行初始化的说。
那有些同学说我还见过一些奇怪的初始化,比方说有些时候写成这样子。
我定义了一个数组,在这儿呢我没有写任何的常量表达式,在后面呢我把这个初始化的结果写出来了。
这样可以吗?这样完全可以,这样是允许的,因为你在后面,在初始化的部分
给出来了明确的数组元素的个数以及每个元素是什么,所以说在这儿
允许你不写任何值。当然你不写的时候你所得到
的那个数值的大小跟你初始化的元素的个数是一样的。
所以说这个程序执行完了以后你会得到一个这样的结果。一个数组放好值了,那有些同学可能立刻就会
想到了那如果我定义了一个数组并且指定了它的大小
但是初始化的时候呢我只指明了部分元素
那会怎样呢?我们来看一个程序。看这个程序。我定义了一个数组,它的大小是4。
但是呢初始化的时候我只给了两个值,那这样会怎样呢?
首先告诉大家这一种方式也是很常见的一种方式。
那么在很多变异性底下它是这样来处理的。那么在这个数组里头前两个元素都进行了初始化。
那么剩下的元素统统被赋值为0。
也就是说当你只指定部分元素的时候,剩下的元素
将自动被指定为0。那么这是数组初始化的时候很常见的一种特性。
甚至在很多程序里头我们是利用这种特性对数组的所有元素
来进行初始化的,比方说我们看这个程序。在这个程序里头我定义了一个数组a[4]。
然后呢我只指定了一个元素0,OK,通过这种方式我就会得到一个
这样的数组。也就是说这句程序执行的结果就使得我得到了一个数组,数组中的每一个元素
都被赋值为初始之0了。这是在程序里头
很常见的一种初始化方法,我们可以利用这种方法
把一个数组中所有的元素全部初始化为0。
那么说到这儿有的同学可能又要问了,你给的情况都是说
指定的元素比数组大小要少,那如果多了呢看一个程序,比方说在这个程序里头
我定义了一个数组a[4],但是给值的时候,给它初始化的时候我初始化了123456。
多初始化了两个原素。那结果会怎样呢?
结果也非常的简单。编辑错误,它会告诉你数组下标越界。
好,这是关于数组初始化的几个需要注意的地方。
各位,这是关于一维数组的初始化。