C和C++语言中常常包括大量指针,这常常让初学者们晕头转向。小编初学指针的时候也常常被指针的指针等困扰,写代码时经常因为没有给指针分配应有的空间出错,看代码也是思路混乱。
其实对于指针的逻辑,有一个比较简单的理解方式。*表示取出指向的内容,&表示取出地址。大家碰到指针时,就一层一层地翻译就行了。
通过 double *p;或者double* p;申明一个指向double类型数据的指针p。那么p就是指针类型double*,而*p是double类型,&p则是p所在内存的地址,是int类型。
比如,我们像上图中代码一样,定义p为指向d所在地址的指针。那么&p, p, *p, &d, d这些量之间有什么关系呢?我们先看看指针的原理。
指针的运行原理如上图所示,即在p != NULL时,p这个指针相当于一个int类型的数,只不过这个数对应的内存上存放着一个double类型的数据罢了。指针p相当于一个地址;*p则是取出地址上存放的数据;&p则是指针p这个变量本身所在的地址。另外,指针占据四个字节的空间,这一点和int类型相同。
所以,上图所示的输出结果具备p==&d && *p==d的特点。
既然指针的本质是int类型,那么我们就大胆一点,试试用int来代替指针是否可行。
运行成功,且满足p==&d && *(double*)p == d。所以进一步说明了指针确实相当于一个存放着地址的int类型。
知道了指针的运行原理,再记住*代表取值,&代表取地址,那么就算是复杂的指针结构也能理清楚了。