首先,计算机是以8位一个字节为最小寻址单位的,并不是按位寻址。计算机把主存中的每个存储字节按照字(32/64位,即最大寻址范围2^x-1)来编码,给每个字节一个唯一的数字标识,称为虚拟地址。所有的虚拟地址的集合就是虚拟地址空间。所以一个指针的长度就是字长,这样可以寻址虚拟地址空间中所有虚拟地址。
C语言的指针有值和类型两个方面,类型包括数据结构类型(数组,数据结构)和数据类型(int,char),抽象的概念反映到主存中就是一个个存储块。所以指针的值时指向存储块中第一个字节的虚拟地址。
举例:
int (*p)[2],p是数组指针,指向一个数据结构的首地址,这个数据结构是长度为2的int数组。
int a[3][2],a是数组指针,指向长度为2的int数组,所以可以把a赋值给p。a+1指向下一个长度为2的int数组,而不是把a的地址值加1。所以说指向同一个数据结构首地址,值相同的指针,类型不一定相同。