【转载】C++指针随想

指针不“指”向任何东西。

一个叫做 pointer 的东西但却一点“指”的语义都没有,还要让人去以箭头的概念想象它的作用和细节,当然会令人感到困惑。
一个叫做 a 的 int,它里面放了 1,要用它的时候用它的名字 a 代表它,要改它的值的时候 a=2,就行。这个语义很直观。

但要想象一个“指针”:
一个叫 p 的“指向 int ”的指针,它指向 a,到这里都还很好理解,可是!!

  1. a 的地址跟 p 是什么关系?
  2. p 的地址跟 p 是什么关系?
  3. p 的地址咋就又成指针了?没有东西在指它啊???
  4. 把一个箭头传进函数里是什么鬼,这个意象好难想象
  5. 蛤?修改箭头的指向本身?为什么我不能把箭头放进一个函数里让这个函数改这个箭头就完事了??
  6. 为什么修改 a 里边的值我不能把 a 传进来,必须传一个指着 a 的箭头??明明 a=2 却可以

上面的意象中是含有矛盾的地方的(比如修改a的值不能使用a这件事)如果把指针想象成箭头,一定会陷入上面的某些困惑里。但实际上指针并不是这种东西。

C语言其实跟汇编极其接近,别看C有这么多内置类型(初中刚学的时候两周卡在第一章的数据类型上差点没放弃),实际上语义上总共也就分为两种,值和地址。

放值的变量,就是那堆 char int float..一开始学背单词背了好久的类型
放地址的变量,就是所谓的指针。

指针不“指”向任何东西,它不是箭头,它仅仅是放了地址的一个变量。

题主问的是指针为什么会这么难,本篇回复也主要想讨论为什么看起来会这么难。我对过去学习的历程一直有记忆与不断的反思,所以大概还能想起一点点当时的想法,但说实话现在已经完全没法理解到难点在哪了,全凭印象。

刚开始的时候很难理解指针是个什么鬼东西。因为刚开始学一门语言的时候,你摸不清那些语句的语义细节和全貌是怎样的。就比如同样是闭包这种概念,有谁能说出来在 js golang python c++里,闭包 capture 的是引用还是值?一个相似的概念在不同语言里语义很可能都不一样,更别说完全陌生的东西。

pointer 在我看来是个十分糟糕的抽象,赋予了某种完全误导的意义。如果 pointer 这种类型叫做 address type,可能理解它就完全不需要这么费劲,只需要解释一下值传递以及地址的作用就好: 参数传递时会把外面的值复制了一份放到函数里面的叫另一个名字的变量的地址上去。就算只是作为规则默认接受也要尝试用箭头的意象去理解指针然后再尝试解释为什么要用箭头才能修改函数外的变量的值要容易得多。更糟糕的是为了拟合“指针”或者“箭头”这种抽象,设计了一个真是箭头->的操作符。这个操作符完全不能解释 strcut *p; p->是在干什么。它还不如设计成 assign/binding 用的 operator,比如 let p -> a ;也要比 int *p = &a 这种看起来多此一举的 declaration 要直观得多。(当然如果能理解 declaraion 到底在“声明什么”的话还算能理解为什么得写成这样)

所以会的人,尤其是理解了指针就是放地址的变量的人,是很难再想象到指针难点在哪的。指针很难学纯粹是因为设计时期采用了一个令人迷惑的抽象才造成了这种现象。观察一下其它的高级语言,大多数用“引用”这个概念去对变量的地址进行抽象。这个概念真的要比“指针”准确得太多,所以很少见到有人会说引用的概念很难理解或很难学。当遇到深浅拷贝的问题的时候也很容易理解复制一个地址跟复制其中的值是两码事。

-reference V2EX

原文地址:https://www.cnblogs.com/drperry/p/12380018.html