以下文字是我针对另一个网友普遍认为的“指针就是地址”等类似论断阐述的一些文字,很多人对这些基础的东西知其然不知所以然,整理出来希望可以对大家有所帮助。& _5 N4 M t# E* T8 O0 ~7 o
( s' y4 v3 R9 E2 N+ LC的指针是个复合命题,三个内容组合起来才是完整的指针:实现C的平台上的地址;类型;运算。对指针的解释,任何单纯拿一部分出来说都是片面不完整的。 0 ^6 J& C7 m' ^# v$ C地址不用多说,问题出现在绝大多数人把地址等价于指针,比如指针就是地址。类型是指针可以解释成的数据组成,包括int,short这样的基本类型,也包括struct弄出来的自定义类型。类型比较好理解,甚至在未知类型的时候,也有一个不完全类型void*来做适配。运算,这个是和类型紧密相关的,比如为什么指针没有乘除法运算,为什么int*的指针做加一运算得到的结果 与 char*的指针做加一运算得到的结果可能不一样,为什么所有类型里面只有指针才有->和*运算,另外,运算概念的理解也可以用void*来说明为什么一个void*类型的指针,不能做任何合法运算。! @; U( _2 R. o8 d. e. H9 u8 S
' ~8 B+ Z% f2 u. J+ L所以指针类似一个组合概念的定义:合法地址,合法类型,针对类型的合法操作,三者共同定义一个指针。9 |5 w, W; d ]! |% y& n' p- q
类型也是一个组合概念:一段合法内存,即sizeof(type)的内存区域;针对该类型的合法操作,所以,比如针对float类型,我们没法用C里面的 a == b 来判断 a 是不是b,而需要用 a - b < delta 来近似等于。7 |6 o; o: H' b* ^& L7 J8 W3 b