EDA365电子论坛网

标题: 说指针 [打印本页]

作者: Abricy    时间: 2016-5-30 17:34
标题: 说指针
以下文字是我针对另一个网友普遍认为的“指针就是地址”等类似论断阐述的一些文字,很多人对这些基础的东西知其然不知所以然,整理出来希望可以对大家有所帮助。- f  J0 Z  Q: n' ^  G  ?' @
7 J; Z# x" C8 ~# e# @" b6 A5 L; B
C的指针是个复合命题,三个内容组合起来才是完整的指针:实现C的平台上的地址;类型;运算。对指针的解释,任何单纯拿一部分出来说都是片面不完整的。8 A' V3 I  v8 R4 g" x2 k! h: I
地址不用多说,问题出现在绝大多数人把地址等价于指针,比如指针就是地址。类型是指针可以解释成的数据组成,包括int,short这样的基本类型,也包括struct弄出来的自定义类型。类型比较好理解,甚至在未知类型的时候,也有一个不完全类型void*来做适配。运算,这个是和类型紧密相关的,比如为什么指针没有乘除法运算,为什么int*的指针做加一运算得到的结果 与 char*的指针做加一运算得到的结果可能不一样,为什么所有类型里面只有指针才有->和*运算,另外,运算概念的理解也可以用void*来说明为什么一个void*类型的指针,不能做任何合法运算。
0 n) d. V" x2 Q3 ]" j2 u7 Z: d
' J9 e( d0 d; |; l) S所以指针类似一个组合概念的定义:合法地址,合法类型,针对类型的合法操作,三者共同定义一个指针。
0 B) B' \7 G# g; w& Z' r, B类型也是一个组合概念:一段合法内存,即sizeof(type)的内存区域;针对该类型的合法操作,所以,比如针对float类型,我们没法用C里面的 a == b 来判断 a 是不是b,而需要用 a - b < delta 来近似等于。
7 {5 d: @  A. c6 V, z$ B1 @7 Z9 K% z  X7 O6 l
重点是类型,再延伸下去,可以延伸到类型和对象,它们的结构不是很像吗。
% k9 m1 W  T; J9 p9 M* Y" a5 l0 Y8 I8 H& Z$ {0 ?$ H
>>>顺便记录一个关于汇编和C语言,起因是不少人喜欢用汇编来解释C,觉得这玩意高级黑,这不是错,错在用的场合。
5 Y, ~: X/ K' s, w' C5 wC有自己的规范,单片机只是一个运行平台,C标准只有一份,而不是单片机单独制定一份,所以在C层面上强调单片机和其他机器那是自欺欺人,因为本就没什么不同。汇编这个层面和C是另一个领域。做设计一个很重要的就是边界定义,哪些是系统的,哪些不是系统的。C自己有自己的边界定义,它是一个完备体系,所以解释C的东西,用C系统里的元素来解释就好。汇编可以加深对编译器的理解和编译器实现的理解,但对帮助C语言的理解作用不大。* M6 p& w( s2 U# C9 w9 o

作者: duzy    时间: 2016-6-1 17:28
谢谢楼主分享!!
作者: yhg-lee    时间: 2017-1-5 13:29
谢谢楼主分享!!
作者: Gegu    时间: 2017-2-8 14:29

作者: liao821    时间: 2017-2-16 13:58

作者: 10929390    时间: 2017-2-16 14:00

作者: zhoumi    时间: 2017-2-17 13:19
~~~
作者: eriks626    时间: 2018-4-17 14:24
指针是 C 最强大的,新的語言都沒有了!




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2