今天重新拿起在2008年买的《C和指针》来温习,
这本书可是经典之作,记得当时卖脱货,等了好久才在当当网上买下来的。
由于对“指向指针的指针”概念一直理解不清晰,看到程序中有这样用到就会产生畏惧心理,今天狠狠心,看能否拿下来!
先借用别人写的C++语言实例,其实和C语言一样的:
#include
using namespace std;int main()
{
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
int **point = &p;cout << "a = " << a << endl << "p = " << p << endl << "&p = " << &p << endl << "point = " << point << endl << "&point = " << &point << endl; for (int i = 0; i < 5; i++) { cout << "&a[" << i << "] = " << &a[i] << endl; } return 0; } 运行结果图如下:
内存分配图如下:
从上图可以看出:
point指针中存放的是p指针的地址,而p指针中存放的是a[0]的地址,所以*point和p两者是等价的。
依照此结论,我们可以推导:
1. **point 等于 *p 等于 a[0]
2.*point等于p:之所以*point和p是一样的,前者是取point指针中存放的地址(0025F754)中的值,即取地址0025F754中存放的值(0025F760),而后者就是0025F760,所以两者是等价的。
3.*(p+1) 等于p指针加1,等于取数组下一个元素的值
4. *point++ 等于 p++这里有个疑问point++是什么呢?
我的理解是point存放的是p的地址0025F754,则point++等于point+sizeof(point)等于0025F754+4,看起来是P后面的地址。
同理:
p++等于p+sizeof(p)等于0025F760+4等于a[1]的地址