(1)指针变量和函数调用的“超链接”属性。
最近,我在看linux内核源码,里面使用到了大量的指针变量和函数调用。现在从类比的思想讨论一下指针变量和指向的真实变量,函数调用和函数定义它们之间的关系。
首先,所有的指针变量都占4个字节指向了可以是一个非常复杂的变量;函数调用就是一行代码,跳出去执行的函数可能有很多行代码,函数体内部能够实现很复杂的功能。从类比的思想看,两者有相似性,函数名其实就是函数代码段的起始地址,函数调用起始从深层角度看也可以看做一个函数指针去解引用访问函数。
那么,从类比角度看,我们比较熟悉的什么实物有这样的特性呢?
答:我能想到的就是“超链接”,超链接的物体可能是一段字符、一个图标等非常简单的实物,当我们建立超链接后,打开超链接后可能是另外一个非常负责的实物,例如一整个网页。
刚开始的需要创建超链接的实物对应的就是定义一个指针变量,此时这个指针变量处于注销状态;
创建超链接,对应的就是给指针变量写入有效数值,给唯一固定下来,这个指针变量处于了激活状态;
通过超链接去访问其他复杂实物,对应的就是通过指针变量去读写访问指向变量或者变量内部的成员,指针变量处于“运行态”。
因为函数名本身对应的地址就是唯一的,所以函数访问的过程只有第一、三两步,函数名是只读的,不能写操作。
(2)从“注销态”、“激活态”、“运行态”三种状态考虑变量、函数的状态。
《1》定义一个函数或者一个普通变量、一个指针变量,这个时候三者相当于处于“注销态”。
《2》给“普通变量”或者“指针变量”写入有效数值,这个时候两者处于“激活态”。
《3》对“普通变量”进行读访问、或者指针变量去读写访问指向的真正变量,或者函数调用,这个时候三者处于“运行态”。
(3)既然寄存器是硬件操作那个的接口,我们只需要操作那个寄存器就可以实现功能了,为什么还要定义一些全局变量、堆变量、临时栈变量呢?
因为寄存器的种类、数量、功能都是不变的,操纵这些寄存器的函数其实就是驱动程序,一个完整的程序是由2部分组成的(简单分类)应用程序和驱动程序,驱动程序只需要操纵这些寄存器就可以了,但是应用程序与具体的业务需求有关,不是一成不变的,这就用到了内存,内存就是一个一个被编码的字节格子,我们将与应用程序相关联的事物抽象成具有特定类型的变量(或者用各种类型去描述事物,有自定义类型例如结构体、数组、枚举等,也有原生类型)并暂时存储在内存中,应用程序其实就是要操纵这些应用变量。应用程序去调用驱动程序来操纵硬件外设工作。驱动程序就是将寄存器的位操作封装打包成能够被应用程序访问对接的程序,驱动程序既有纯硬件操作寄存器的特性,又有一部分应用程序的简单特点,因为它提供了参数列表和返回值,能够为应用程序提供简单服务。