参考博客:http://blog.youkuaiyun.com/shiyuqing1207/article/details/45937447
因为这段时间做的一个电视机遥控器的APP项目是和底层一起开发,我负责的是android上层部分,而主要的连接和发送是公司的c的妹子写的,上下层对接使用的是JNA,期间可以说是问题不断,主要就是因为数据传递过程中,底层用指针操作的时候的一些问题,逼不得已,这周末,作为一个大一学过c之后就再也没碰过的人,我对突然产生了浓烈的兴趣,就研究了一下,主要就是看到上面的那篇博客,可以说写的是非常好,然后我自己也总结了下自己的理解,有不对的地方希望大家可以一起讨论,增进对指针的理解。
int a = 2;
int* p = &a;
int &q = a;
这里呢,其实 &q = &a = *p;
q其实就是a,而 p其实是a的地址;所以对q的操作就是在内存中就是对a的操作,而对p的操作其实是对a的地址的操作(这里表达错误,对p的操作其实是对p的内容的操作,也就是那个地址的操作,对a的本身的地址没有任何影响),所以才说其实类似于fun(int* p); fun(&a);这种操作其实也是值的传递,这个值是a的地址,也就是p中存的是a的地址。
个人理解,*其实是一种运算符,根据地址去求值的运算符,而int* p = &a;
实质上是是将a的地址赋给了p;然后根据*p就可以去求出这个地址所对应的值,所以这个p本身的内容就是a的地址,而p也拥有自己的地址,所以对*p自加也就是相应的a的值也会自加,而对p自加其实是将p自己的内容自加了,也就是将存储的地址加1了,*p所求出来的就是另一个地址的值,并不会改变a的值。
个人理解2:其实每一个变量所对应的都是有自己的地址和值也就是reference和value,而像a啊这些什么的知识我们程序员给这个东西取的名字,再说一下&,这其实是一个求址运算符,求出该变量对应的地址
具体的大家可以参考我上面参考的那篇博客,里面的图和实例真的非常好,太解惑了。