听故事学语言 · 第十五章 C 语言的灵魂,指针
零基础的建议从序章读起。
一、一个词的正名
每一位把 C 语言讲到底的老师,都要在这一章门前站一站。假设一位老师,别的章节讲得气定神闲,讲到指针的这一章,会先把手按在讲台上稳一稳,再开口。不是课没有备好,是所有教 C 语言的人,都领过同一道难题。
难关难在两处。第一处,它新。前面的章节里,变量存的都是值,一个数,一个字符,一段文字。从这一章起,变量要存的内容换了一种,是另一个变量的位置。第二处,它逼着人把内存看真切。前面的章节可以把内存当作幕后,从这一章起,内存必须走到台前。好在办法是现成的,从第一章用到今天,不背咒语,跑出来看。
先给这一章的主角正名。指针的英文是 pointer,它来自 point,点,尖。这个词的祖上是拉丁语的 pungere,意思是刺、戳。今天英语里还留着很多同族的词,pungent 辛辣的,辣得像被针尖刺过;puncture,刺穿;punctual,准时的,本义是踩准时间上的那一个点。pointer 由 point 而来,本义是那件用来指的器物。这个词在英语里干过好几份差事,最早是石匠手里尖头的凿子,后来是日晷、仪表盘上那一支指示的针,中文把它译作日晷的指针、仪表的指针;到了计算机里,它成了一种变量,里面存着另一个变量的位置。词义三步走,先是一件尖头的器物,再是一支会指的针,最后是一个会指路的变量。
中文的指针不是生造的词。钟表有指针,仪表有指针,都是盘面上那一支细细的针。当年的翻译家借的是这个旧词,借得极准,针自己不带刻度,针只负责指。但这个词