温馨提示:文本由机器自动转译,部分词句存在误差,以视频为准
00:00
这两行代码有什么区别?说出三个及格,说出四个一般,说出五个offer正向招收,这个就是经典面试必考题。数组和指针的区别,今天两许就给你掰开了,揉碎的讲清楚。我们先看第一行圈S11等于两许,这是个数组,你可以把它想象成程序在账上给你画了一块地,然后把两许这8个字符,包括最后那个看不见的结束符写杠0,一个一个复制进去,这块地是你的,你想怎么改就怎么改。比如说你想把第一个字符改成大写L,完全没问题,二十一零等于L,改完之后S11就变成了大写的两许。再看第二行圈CS2等于量许,这个是指针。这里的门道就多了。首先量许这个字符串会被放到一个叫做只读数据段的地方,这个是程序的产量区,然后S12这个指针只是记录了这个字符串的地址,就像一个门牌号,关键来了,因为呢,这个字符串在只读区,你要是敢写成S10。
01:00
20等于大写L,程序直接不给你看了,为什么?因为呢,操作系统不允许你修改只读区的内容,这是硬性的规定。咱再深入一点,数字21它的名字本身就代表这块内存的起始地址,而且呢,这个地址是固定的,你没法改,你不能说21=21+1,让它指向别的地方,变译器直接给你报错,但是呢,指针22就灵活多了,它只是一个变量,存的是地址,你完全可以让它指向别的地方,比如说22=21,现在22就指向了21的内容了。还有个特别重要的点,内存占用数组21在站上占用了8个字节,存的是实实在在的字符,而指针22呢,在64位系统上指占用8个字节,但这8个字节存的不是字符串的内容,是地子字符串,两许本身在子读区占用8个字节,所以呢,从内存布局上来看,它俩完全是两码事,你可能会问,那我用30F看看不就知道了,对。
02:00
32和21会返回8,因为数组确实占用了8个字节,但是32和22只会返回指针本身的大小,在64位系统上就是8,在32位系统上就是4,跟字符串长度一点关系都没有,这是很多新手踩的坑。再说个十际的场景,假如说你要写一个函数,参数是字符串,你传21进去,实际上传的是数组首元数的地址,数组会退化成指针,但如果你在函数里用32伏,得到的就不是元数组的大小了,而是指针的大小,这就是为什么我们通常还要额外传一个长度参数。最后总结一下,数组是一块实实在在的内存空间,内容可以修改,地址固定,指针是一个变量,存的是地址指向的内容,通常在指读区不能改,但指针本身可以指向别的地方,记住这个本质的区别,以后写代码就不易搞混了。好了,今天就到这儿,如果觉得还不错的话呢,记得给梁旭点个赞,咱们下期见。
我来说两句