1.数组的集成初始化
搜索是现代计算机或者说互联网上频繁在发生的事情.现在我们来看一个最最最基本最简单的搜索要怎么去做.在给定的一组数据中,如何找出某个数据是否存在?我们来看一段现成的代码:
我们在开头定义了一个数组,像这样定义一个数组我们把它叫做集成初始化.我们定义数组的时候有两种方案,一种是定义的时候我不去初始化它,等后面在循环遍历数组依次给每个数组单元赋值,第二种就是我们给数组一组数字,我们用这一组数字去初始化数组a[],而且我们也可以在把方括号留空,不给出数组具体的大小,让编译器替我们数.
我们也可以这样定义数组:int a[13]={2};这样做编译器会把2赋给数组的第一个单元,然后后面的单元全部赋给0.你还记不记得,我们前面用了一个循环遍历数组的手段来把数组所有单元的值都初始化为0,其实我们有个更调皮的手段.我们可以这样:int a[13]={0},它会把数组内所有单元都初始化为0(其实我试了一下,发现就算大括号是空的结果也一样)
2.集成初始化的定位
另外我们在c99里,还可以做这样一件有趣的事情.它可以用这样的方式去给指定的位置赋值:
我们用[n]在初始数据化中给出定位,没有定位的数据在前面的位置后面.其他的位置补0.这样子赋值的意思是,a[0]=2,a[1]=0,a[2]=3,a[3]=6,剩下后面所有单元都被赋0,这种写法比较适合初始化数据特别稀疏,有很多个0,但是其中又有一部分不是0.还有,如果我们没给出a的大小,c99也是支持的.它会帮我们数,如上面如果不给出方括号里面的10,他就会帮我们把数组的大小定义为4.
3.数组的大小
我们通过集成初识化可以让编译器替我们数出来这个数组有多大,可是后面循环遍历的时候我们还得自己一个个数到底有多少个数组单元.其实我们可以通过另外一种方式:sizeof(a)/sizeof(a[0]);第一个sizeof给出整个数字占据的内容的字节大小,第二个sizeof给出每个单元占的字节大小.我们上面这个程序给出的length就是这么来的.这种方式得出来的数组单元的个数永远是正确的.这样的代码最大的好处是,一旦数组中初识的数据,不需要修改遍历的代码.比如我们在a[]里又加上两个变量或者删去三个变量,仍然不会影响后面的遍历.
另外,根据一些古老的教科书,我们有一个口耳相传的传统,当我们要去集成初始化一个数组的时候,我们可以在最后一个数字后面加上一个逗号,这个逗号不会影响编译的任何结果.但是它的好处是,如果你想要加一个新数字,就不用再敲这个逗号了,当然,为了后来人更方便,你再敲上一个逗号吧.虽然确实显得很没有意义,但是这可以显示你有没有读过七八十年代的计算机的书,你可以用它来装一装的.
4.数组的赋值
像这样
是不允许的.不能直接这样把数组变量赋给另一个数组变量,实际上数组变量是一种const的东西,我们到后面讲到指针再深入探讨.所以你要把一个数组的元素交给另外一个数组,只能采用遍历的方式.
5.遍历数组
我们之前已经有过很多遍历数组的例子:
我们通常都是使用for循环,让i从0走到<数组的长度,这样循环体内最大的i刚好是数组最大的有效下标.常见错误是:循环条件为<=数组长度或;离开循环后,继续用i来做数组元素的下标.这样我们的i在离开循环的时候刚好是数组的长度,正好就是那个数组无效的下标.
6.其他
这是上面程序的大概思路.
还有一点是,当我们用数组作为函数参数时,往往必须再用另一个参数来传入数组的大小.为什么呢?因为数组在作为函数的参数时:
- 不能在[]给出数组的大小.(给了也没有任何意义)
- 不能再利用sizeof计算出数组的长度.(指针的知识)