lgh520 发表于 2019-10-19 19:34

让你不再恐惧c中的指针之数组指针

如果你要问我C语言学得好不好的判断标准是什么,那就一定是指针,而指针的头号当属数组指针非常难以理解,我们常常看到书上写的什么整形指针就是指向整形的指针,字符指针就是指向字符的指针,那再接就是数组指针就是指向数组的指针,我去你的,你确定?我今天就不指向数组。

你帮我看看我指向的是一个数组吗?我难道不可以指向一个整数吗?不仅如此我还可以正常取值。

今天我就换个角度来让大家学习指针,首先明确在汇编的世界里面是如何看待你的数的,比如int 4个字节,char 1个字节,short 2个字节,在它的眼里数除了宽度之分就是大小之分,在它眼里就是一堆二进制。
因此我就认为整形指针指向的就是一个4字节的指针,字符指针就是指向一个1字节的指针,所以数组指针就是指向特定宽度的一个指针,我想让你指向4个字节我就让你指向4个字节,我想让你指向100个字节都没问题,毕竟数组也是可以改变整体宽度的,*前面的类型仅仅是限定了这个指针指向的区域宽度罢了。
根据这般理论,我们就可以创建一个指向4*2宽度的指针对吧!

就像这样。现在他指向的区域就是8个字节,如何证明呢?打印一下就可以了

和猜想一致,既然如此我就可以随便安排一个8字节连续的内存空间给你指向,所以我就随便定义了两个int型的变量,如果你问我为啥不直接定义一个数组呢?当然是为了装b啊!当然不是啦!主要还是为了去推翻那些无知的定义罢了。
定义了两个int型的变量分别是1和2刚好足够8个字节,我们看看反汇编这两个数是怎么存储的吧!

他们存储是连续的且2在低地址1在高地址,这就是我为什么要取变量b的地址来只让数组指针指向的原因了!
最后通过*a1就得到了一个元素个数为2元素宽度为4字节的数组了,最后通过数组的方式来取值取到的第1个元素就是0,第2个元素就是1了。

只为点滴幸福 发表于 2019-10-19 19:55

加油!加油{:301_1003:}

xiaosuobjsd 发表于 2019-10-19 20:08

不需要证明是8个字节。a1是个整形数组,a1就是4字节,a1就是8字节,这是一个常识,不需要证明

z1036853215 发表于 2019-10-19 20:52

感谢感谢

lgh520 发表于 2019-10-19 23:37

xiaosuobjsd 发表于 2019-10-19 20:08
不需要证明是8个字节。a1是个整形数组,a1就是4字节,a1就是8字节,这是一个常识,不需要证明

嗯,小提了一下而已

AA_BB_2AB 发表于 2021-4-2 16:00

谢谢,祝您身体健康!
页: [1]
查看完整版本: 让你不再恐惧c中的指针之数组指针