C++关于数组的一些看法

       本来想等我完全学完C++再好好一些篇心得总结,还有归纳好C++的一些常用知识点。但是今天看看了数组,虽然学习C语言的时候,数组也学得差不多,但是今天学到了一些新的知识点,觉得非常有用,就忍不住写下来了。

        首先,第一点。如何理解数组,数组的初衷就是把相同类型的数据一次性地定义出来。那么我们应该怎样理解数组呢?我看过一个视频,那个老师说要站从编译器的角度去理解数组,就是看编译器是怎样理解数组的,我觉得他的话非常对。比如:int  a[3],应该分2部分,第一部分是a[3],第二部分是int。编译器看到a[3],就知道这个一个数组([ ]是数组的标记),马上定义一块内存,这个内存有3个坑(内存大小未知,与存放的数据类型有关),而且这个内存名字是  a ,然后第二部分是  int ,这个是告诉编译器,定义的内存是存放  int 型数据的。                  再比如:int  b[3] [3],这个也是分成两部分,第一部分是b[3],第二部分是int  [3] ;第一部分显然是告诉编译器,要我定义一个数组,数组要有三个坑,这个内存名字叫做  b ,第二部分是定义的内存要存放  int [3] 这个中数据类型(注意int [3] 也是类型)。其实int  b[3] [3]也是二维数组,但是内存是没有二维的,都是线性的。(所以谭教授的那本C++的教程,这个点我觉得有点说得不好,不容易理解,但是他的书绝对是经典,很合适我这种菜鸟)

        其次对元素的赋值。可以是  int a[3] = {  1 , 2 , 3 }  (初始化便赋值);也可以:

int a[3];
a[0] = 1;
a[1] = 2;
a[2] = 3; 
     但是,一定不能这样:
   
int b[3];
b={ 1 , 2 , 3};//更加不能b[3] = { 1 , 2 , 3};首先b[3],这里是认为b这个数组的第四个元素,然而上面数组的定义只有3个内存单元。

       然后,谈一下字符串和字符数组。其实字符串就是字符数组,因为字符串再内存存放就是一个数组。

char s1[5] = { 'a' , 'b' ,'c' };//char s1 = { 'a' , 'b' ,'c' ,'\0'};
char s2[5] = "abc" ;//其实这个两者并不等价上面的要加上‘\0'才行,即上面的注释。

      接着,说一下我今晚搞明白的新的知识:(程序在VS2017版本上编译)

char s2[4] = "abc";//这样编译不会出错,输出也正常,没有发生乱码。这个是因为"abc"这个字符串本身就是含有\0结尾。
char s2[4] = {'a','b','c'};//这样编译不会报错,但是输出不正常,输出结果往往是abc接着一堆乱码
char s2[4] = ['a','b','c','\0'};//这样编译不会出错,输出也正常
char s2[4] ;
s2 [0]='a';
s2 [1]='b';
s2 [2]='c';//这个也编译没报错,但是输出也是abc加乱码,但是在加上一句s2 [3] = '\0';那就正常了。
char s3[2];
s3 [0] = 'a';
s3 [1] = 'b';
s3 [2] = 'c';
s3 [3] = '\0';//这样子,编译没报错,但是却不能输出,也就是的调试时,那个面版没有显示。

从以上例子可以知道,想要数组输出正常,必须要有\0这个符号,没的话,输出会有乱码(但是书本上说s[4]={'a','b'}这种后面是会自动补 \0。这个应该是个全局变量)。以下是这个网友给出的答案,我编译过,的确是这样的。但是还有一个问题,为什么我们定义了这个数字的内存大小之后,输出这个数组,它可以访问超过它的内存之外的存储空间呢?指针是可以指向任何地方,也就是它访问任何地方(有些内存不许访问的除外),但是,它不能保证不会出错。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值