9.1.3 直接访问和间接访问
上面计算i+j的过程,是按照变量的地址存取变量值,这叫“直接访问”。与“直接访问”相对的,叫“间接访问”。那么“间接访问”是什么意思呢?
在C语言中,一般用int、char、float、double这些类型的变量来保存值。那么,也可以定义一种特殊的变量,这种特殊的变量专门用来保存地址。假设定义了一个变量mypoint来存放整型变量的地址,请注意,虽然这种特殊变量是用来保存地址的,但它也分保存什么类型变量的地址,这里mypoint是用来保存整型变量地址的。如下语句就把变量i的地址保存到了mypoint中,这其实就是一个赋值语句:
请注意,虽然这个特殊变量mypoint是用来存放整型变量i的地址的,但是mypoint这种特殊变量本身在内存中也是有地址的,所以它也是占内存的,这种特殊变量在x86平台下一般占4字节内存(之所以强调x86平台,是因为这种特殊变量在其他平台如x64平台下占用的并不是4字节内存而是8字节内存)。现在,内存看起来可能如图9.3所示。
图9.3 存放地址的特殊变量mypoint
现在要存取i的值,就有了一种间接的访问手段,那就是先找到存放i的地址的这个内存位置(3000~3003)也就是mypoint的内存地址,从这4字节的内存中取出i的地址(1000),因为知道mypoint里面保存的是整型变量i的地址,而又知道整型变量是占4字节,这表示1000这个地址开始的4字节(1000~1003)里面是个整型数据,那从1000开始取得4字节数据,也就是5,就是i的值,这就是“间接访问”——通过特殊变量mypoint,间接访问了变量i的值。
在掌握了“间接访问”概念后,就可以真正地引入“指针变量”概念。什么叫指针变量呢?
如果一个变量,如这里的mypoint,专门用来存放另外一个变量的地址,则称这个变量为“指针变量”。mypoint就是一个指针变量。指针变量的值(也就是其中存放的值)是一个地址(也有人称为指针)。所以这里要仔细区别“指针变量”和“地址/指针”这两个概念,指针就是一个地址(地址是用数字表示的),指针变量是存放其他变量地址的变量,也叫该指针变量指向某某变量(如这里的mypoint指向i)。