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

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

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

引用文章相关段落如下:

现在我们可以这么写:

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

a8MUU

如果我们接着这么写:

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

bpfxT

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

最佳答案:

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

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

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

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

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

5 收藏 6 评论

关于作者:菜鸟浮出水

a tiny programmer 个人主页 · 我的文章 · 13 ·     

相关文章

可能感兴趣的话题



直接登录
最新评论
  • 最后一张图是错的,ipp应该指向ip2

  • 象角塘   2014/03/05

    容易混淆的是C语言中“数组首地址”,“多维数组首地址”和“指针”的区别。

    指针本身非常容易理解。

    数组首地址本质上只是个label。不像指针那样有内存地址。但是使用起来又很类似。所以容易混淆。

    多维数组地址和多维指针差别就更大。

  • swc129   2014/03/05

    楼主正解,一楼考虑错了。这是vs 运行的结果

  • holmescn   2014/03/06

    pointer以及被谭老师翻译成的“指针”这个概念根本就是对学生的误导。根本就没有什么pointer,这个就是个形象的说法,结果到了国内就成了C语言里最灵活,最难懂的知识点。其实根本就不需要这个概念,当你写一个T*的时候,你就是在写汇编,就是一个内存地址。that is all, nothing else.

  • Mick   2014/05/28

    初始化表达式**ipp = &ip1表示的是 ipp这个变量所存储的值是&ip1,而*ipp = *(&ip1) = ip1,因此*ipp = ip2实际上就是ip1 = ip2。要替换掉ipp中所存储的值,则要用ipp = &ip2这个表达式。

跳到底部
返回顶部