指针是类型还是地址

编程语言中的类型系统的本质是将现实中的数据进行有意义的分类,然后做映射。

比如现实中有整数也有浮点数,对应到类型系统就是 intfloat 等。

intfloat 等这些类型还有个共同特点——都是数值类型,数值类型的一个属性就是可以做四则运算,所以我们可以对同属 int 类型的变量 ab 做如下操作:a + b

我们还知道数据是存储在内存中的,而内存是有地址的。地址本质上其实就是一串数字,但是为了能够更好的区分存储了不同类型数据的地址,我们强行把地址进行了分类,即存储了整数的地址和存储了浮点数的地址,对应到类型系统就是 int*float* 等。

int*, float* 等这些类型还有个共同特点——都是指针类型,指针类型的一个属性就是可以使用间接运算符 * 获取其保存的地址所对应的数据(右值语义),所以我们可以对 int* 类型的变量 a 做如下操作:*a

从上述的对比来看,指针其实类比着数值这个层次的概念。他本身是更高层面的一种特质描述。

数值和数值类型的区别是数值是一种更笼统的描述,它描述的是一种特质(可运算的东西),而数值类型就是类型系统中int,float 等类型的统称。

指针和指针类型的区别就是指针是一种更笼统的描述,它描述的是一种特质(可间接获取值的东西),而指针类型是类型系统中int *,float*等类型的统称。

而地址则只和指针类型有关系,即类型系统中的指针类型映射的是现实世界中的地址(语义上)。

总结就是,狭义上指针和指针类型其实是不同层次的描述;广义上指针可以是指针类型的简称(就好比数值和数值类型的关系,我们既可以说 1 是数值类型的数据,也可以说 1 是数值);而因为指针类型存储的就是(语义上的)地址,所以巨义上指针代表的也就是地址数据。

再总结就是,狭义上比起指针是地址,指针是类型更贴合一些;广义上只要理解了指针的本质,这些无非就是话术而已,不同的说法适用于不同的语境。