指向指针的指针

如果一个指针变量存放的又是另一个指针变量的地址,则称这个变量为指向指针的指针变量或指向指针的指针。

定义方式:   数据类型  **变量名;

 

int a=10;        //地址为&a
int *p=&a;        //指针地址为&p    如果是p就是a的地址
int **p1=&p;        //指针地址为&p1     如果是*p1就是&p</span>

要注意这几个地址的区别,不能混淆了。

 

 

指针运算符

指针运算符有两种:

  • 取地址运算符&:& 是单目运算符,其结合性为自右至左,功能是取变量的地址。
  • 取内容运算符*:* 是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。在 * 运算符之后跟的变量必须是指针变量。

问题:如何理解指向指针的指针?

我在一篇教程中看到下面这段,它描述指向指针的指针是如何运作的。

引用文章相关段落如下:

int i = 5, j = 6, k = 7;
int *ip1 = &i, *ip2 = &j;

 

现在我们可以这么写:

int **ipp = &ip1;

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

如果我们接着这么写:

*ipp = ip2;

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

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

#include<stdio.h>
void main()
{

    int i = 5, j = 6, k = 7;
    int *ip1 = &i, *ip2 = &j;

    int **ipp = &ip1;
    printf("%p %p\n", &i, &j);
    printf("%p %p\n", &ip1, &ip2);
    printf("%p\n", ipp);
    *ipp = ip2;
    printf("%p\n", ipp);
    printf("%d", **ipp);
    getchar();

}

结果:
0038FAD0    0038FAC4
0038FAAC    0038FAA0
0038FAAC
0038FAAC
6

 

最佳答案:

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

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

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

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

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

原文链接: StackOverflow   翻译: 伯乐在线 菜鸟浮出水
译文链接: http://blog.jobbole.com/60647/

posted @ 2018-08-19 20:49  WHyichao  阅读(48)  评论(0)    收藏  举报