如何理解指向指针的指针?

来源:互联网 发布:php好玩的小例子 编辑:程序博客网 时间:2024/06/05 09:00

我在http://blog.ithomer.net/2014/04/c-c-how-to-understand-pointers-to-pointers/看到关于双指针的文章,在此说说的的理解;

引用文章相关段落如下:

int i = 5, j = 6, k = 7;

int *ip1 = &i, *ip2 = &j;

现在我们可以这么写:

int **ipp = &ip1;

那么现在指针 ipp 指向了 ip1,ip1 指向了 i。*ipp 就是 ip1,**ipp 就是 i,或者说是 5。我们可以用我们熟悉的盒子箭头图来描述,像这样:

 

algrithm-01

 实际我们可是将上述代码:

int **ipp = &ip1;

也可以这么写:

int **ipp;

ipp = &ip1;

ipp是一个双指针,那么它所保存的值一定是一个指针的地址,就像上面代码中所示,ipp保存指针ip1的地址,那么:

*ipp就等于 ip1;

如果我们接着这么写:

*ipp = ip2;

我们就改变了 ipp 指向的那个指针(也就是 ip1),现在它指向 ip2 所指的地方。也就是说(ip1)现在它指向了 j:

algrithm-02

这可以这样理解,既然*ipp等于ip1,那么上边的代码也可以这么写:

ip1 = ip2

也就是ip1指向ip2,也就是指向了j,因为ip2中保存了j的地址,现在赋给了ip1,那么ip1就指向j了;


我的疑问是:为什么在第二幅图里,ipp 还是指向 ip1 而不是 ip2?

最佳答案:

让我们暂时忘掉那些关于指针的各种类比。指针实际上存放的是内存的地址。

& 符号的意思是取地址,也就是返回一个对象在内存中的地址。

* 符号的意思是取得一个指针所指向的对象。 也就是如果一个指针保存着一个内存地址,那么它就返回在那个地址的对象。

所以当你这么写时 *ipp = ip2,实际上是把 ipp 存的地址所对应的对象,也就是 ip1 取到,然后把 ip2 存的值赋值给 ip1,也就是 j 的地址。

简单点就是:&:取址。* :取值。


蓝色部分是我得理解

0 0
原创粉丝点击