第十五讲 数组

        在第十四讲里面的有个转换二进制的程序有点失误,因为平时敲惯回车换行(rn),所以不自觉的在r前面添加了个反斜杠,相信大家都看出来了,不过现在已经更改过来,有想要重新回顾的可以直接回复14查看,不过很抱歉,如果有错字少子我可能还是没有更改过来,作为中国人,大家都懂的,多字少字错字甚至是错乱的顺序一般都不会影响阅读和理解的,好了,今天我们来说说C/C++里面的数组。
说到数组,相信大家都不会陌生,从一开始我们的hello world开始,数组对我们来说已经是屡见不鲜了。
数组在编程中有着不可或缺的重要性,在C/C++里面他的重要性不比指针低,那么,这么重要的东西,数组到底是什么东西呢?
数组,就是线性存储的一系列相同类型的值,例如:
int  m_array1[20];


       float m_array2[20];


       char m_array3[20];


       ……
在 m_array1[20] 里面的值都是int类型,而 m_array2[20] 的都是float,如果有不是float呢?直接强制转换成float,同样, m_array3[20]里面都是char类型,而且这些数据在内存里面是储存在一系列连续的内存块里面。
大家是不是想问,既然数组储存在一块内存里面那么怎么表示他们的首地址呢?哦,这似乎又和指针关系扯在一起了,所以对于这个问题,明天再来给大家解答。
数组的初始化通常是在花括号中完成的,例如:
   1. int  m_array1[20] ={0 };


       2.float m_array2[20] ={1.2,1.5,16.2…… };


还有一种初始化,如下:
  3.
int m_array1[20] ={1,2,3 };

关于上面我们说的三种初始化方法,第一种是用0初始化所有的,第二种是逐个初始化,第三种明确初始化一部分余下的全部初始化为0.
那么为什么要说初始化?因为数组和指针不同,数组在声明后就一定要初始化,而对于指针却不然,同样对于数组,一旦声明后,他的大家也就固定了,对于指针……又想说却不然了,但真的是却不然,所以对于数组的初始化很重要。
还有一种对于数组的声明方式,那就是没有明确指明这个数组到底有多大,他的大小有初始化他的内容来决定,想必大家一定还记得我们下面的这个声明:
   char name[] = “Hello World”;


大家想一下,我们name的长度到底是多少?可能有人会认为是10,因为这确实是10个字符,可能有人会说中间还有空格,所以应该是11,当然如果对C/C++有一定了解的同学应该只是,这是12,因为在后面还有’�’。这就是C语言的字符串风格,而且就算C++里面有一个更好用的string,但是在开发程序中,C风格的字符串还是不可或缺的,很多数据还都需要用数组来传递。
那么怎么取得这种不明定义的数组的长度呢?我们这里有一个操作符:sizeof(),这是一个操作符,不是函数,所以希望大家不要把他和strlen()搞混了,strlen()才是真正的函数,他的功能同样是计算数组的长度,但有一点值得注意,数组作为sizeof的参数不退化,但作为strlen()的参数后退化为指针,还有对于明确声明长度的数组分别用sizeof和strlen来计算长度会有不同的结果:
sizeof(name) = 12;


        strlen(name) = 11;


        sizeof(m_array3) = 20;


        strlen(m_array3) = 3;


有兴趣的同学可以网上搜一下关于sizeof和strlen的区别,关于strlen我们留待cstring的时候再来说说,到时候也会把他和sizeof的区别好好理一下。
一个初始化说了这么多,感觉好浪费的说,不过如果大家真的弄清楚了还是值得的,下面我们来说说关于访问数组中的元素的问题。
char name[] = “Hello World”;


当我们声明定义这个数组之后,编译便会默认我们的name长度是12,也就是说我们这个定义相当于:
char name[12] = “Hello World”;


所以我们可以通过下标来对name里面的元素进行访问,但是有一点得注意,关于访问元素的下标是从0开始的,所以name[0]表示第一个元素,也就是H,以此类推,如果大家想要通过打印方法来把这些元素分别一个个显示出来的话,到最后一个元素也就是name[11]时发现什么也没打印,不错,因为这个元素是C字符串数组的结尾符,是’�’,所以什么都不打印。
那么我们是不是可以定义另一个数组,用已知的数组去初始化这个数组呢?像下面这样:
char  name1[] = name[] &

name1[] = name?
这当然不可以,是不是有人会问,如果这样都不可以,我们怎么把一个字符串复制给另一个字符串呢?哦,不好意思,也似乎也不是复制,按C/C++的逻辑,这算是赋值了,当然赋值也包含了复制的功能,不过不管是赋值还是复制,我们都可以实现。
下面我们就为两个字符%