C语言中的指针

指针是C语言中非常重要的东西,书本上写了好多来解释里面的原理,当年老师也跟我们讲了好多这方面的东西,一直就是感觉没有听明白。直到我看到了指向指针的指针,我建立了自己的理解,不知道是否正确,但是基本能解决遇到的问题。


int *p , p=&i , *p。

type *p,声明指针变量,type(例如int)告诉计算机p这个指针指向的这个东西占用多少个字节(byte)。

例如int *p,i ; p=&i ; 这一句告诉计算机有一个指针p , 它指向 i 所占的4个地址的第一位,由于提前告诉计算机,我这个是int型指针,计算机就知道p指向的变量到底有多长,所以当执行*p+1时,这个时候计算机就知道要跳过4个地址。


p到底是什么?他就是一个快捷方式。快捷方式存的就是你程序所在的地址。

那么p有多大?你有多少个地址,p就有多大,这是根据操作系统来区分的。

例如在32位系统中,寻址空间为2^32,那么对于的p就要能区分2^32个地址,就是32位的2进制数,换算成字节就是4个字节,显然得知,64位系统,就是8个字节。

如果不是这么大,那么就不能保证所有的地址都有唯一编码了,就无法表示了。

所以p里面存的内容就是 i 所在的地址的第一位,也就是A(这里用ABCDEFGH来代表一个存储地址,根据计算机位数不同,他可能代表一个32位的2进制数,也可能代码64位的2进制数。)

*p是指,我要去读取p指向的地址里面存的内容。计算机会先去找到A,然后因为p是int型,它占4个字节,那么计算机就顺着读4位,读了(ABCD)中共同表示的内容,也就是 i 的值。


好!这里理解了,现在聊一下指向指针的指针,就非常好理解了。


q=&p

q里面存的是p指针所在的地址,因为int *p是会给指针p分配一个地址,这个地址里面,存着地址A。

*q就是查看&p这个地址里面存的到底是什么内容。这里的话就会发现,它存的是地址A。

那么**q就等同于*p,而*p又表示 i 的内容。


所以就非常好理解了。


我们可以这么认为:

我们计算机里面的所有地址与里面的内容一一对应,指针就是分配一个地址,让里面的内容是一个地址信息。

而其他类型的变量,就是在一个地址里面,存着由二进制码表示的内容。



再聊一下*这个运算,*(地址),是去读地址里面存的东西。假设m=&q,我们可以用***m去访问i的值。如果*后面接的不是地址,这个量也会被认为是地址,执行*运算后,就会不知道指向哪里,就有乱码之类的情况出现。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页