6.1.4 指针、指针变量与内存地址
对于初学 C 语言的人来说,常觉得指针部分比较难,搞不清指针里的术语算是原因之一,这些术语之间关系密切,但又有着微妙的差别,时常令人眼花缭乱、迷惑不解。
指针、指针变量和内存地址,很多人分不清这三者之间的关系和区别。因为指针变量可以存储内存地址,而内存地址可以看成是指向对象的指针,因此,既可将内存地址看成是指针,也可将指针变量看成指针。这会造成一种情况:如果在文中提到指针一词时,需要根据当时的语境以及上下文来判断这个指针到底是表示内存地址的意思,还是指针变量的意思。
下面列出几个关于指针的描述:
(1)“指向 A 的指针”,这里的指针可以理解为 A 的内存地址。
(2)“定义一个指针”,这里的指针可以理解为一个指针变量。
(3)“通过指针获取 A 的值”,这里的指针可以理解为 A 的内存地址。
(4)“移动指针”,这里的指针可以理解为一个指针变量。
由于指针的实质就是内存地址,因而第 1 条和第 3 条当中所叙述的指针就是 A 的内存地址,以及通过 A 的内存地址去获取 A 的数据;而第 2 条和第 4 条中,都是对指针本身的修改,内存地址是常量,是不能被修改的,因此,这里的所叙述的指针其实表示的是指针变量,即修改指针变量自身所存储的内存地址值,指针变量所存储的地址值不同了,就相当于指针被改变了。
可以看出,同样是指针一词,在不同的表达和描述中,能够表达不同的意思。如果是对指针比较了解的人来说,没有什么问题。但对于接触指针时间不长的人来说,往往就会产生困惑,很容易造成理解上的偏差。
鉴于此,我们可以尝试着把指针、指针变量和内存地址这三者之间进行区分,重塑它们的定义和功能,让它们之间的关系清晰化、明朗化。
首先内存地址是内存单元的一个编号,可以把它当成一个常量看待;而指针变量是一个能够存放内存地址的容器,它是一个变量;指针是无形的,我们可以把它想象成一个带着箭头的长线,线尾连着指针变量,而箭头则指向了指针变量所保存的内存地址处的数据。
我们可以将 C 语言中的变量、常量、数组、函数等看成一个数据对象。当得到一个对象的内存地址后,就会产生一个指针,这个指针的箭头指向了该内存地址处的对象。我们可以把这个内存地址存储到一个指针变量中,这就相当于在指针变量和对象之间,有一条无形的指针相连,如图 6.5 所示。
图 6.5 指针、指针变量和内存地址
图中右侧深色部分表示一个对象,它所对应的内存地址为 100,而左侧浅色部分是一个指针变量,它保存着 100 这个内存地址,此时,就好像有一条带着箭头的长线,线尾连着指针变量,而箭头则指向了内存地址为 100 的地方,即深色部分的对象。这条带着箭头的虚线就是指针,用户可以通过该指针对深色部分的对象进行访问或修改。
内存地址是常量,而指针变量是变量,当指针变量中存储一个内存地址后,就相当于在指针变量和该内存地址处的对象之间有了一条指针。或者,更简单点说,内存地址是一个常量类型的指针,而指针变量是变量类型的指针,而真正的指针是不存在的,它只存在于我们的脑海和思维中。
下一节将讲述怎样才能定义出用于保存内存地址的指针变量。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论