- 论坛徽章:
- 0
|
能否详细说说有什么不同?
KBTiller 发表于 2010-12-08 22:35
通常意义上的address,可以认为是指存储器编址的一种简单的数学模型(地址空间)中的元素,也就是一个(非负的)整数。
C语言中的address constant(C++所说的address类似)是指指针(类型的实例)——
ISO C99 6.4.2:
Anaddress constant is a null pointer, a pointer to an lvalue designating an object of static
storage duration, or a pointer to a function designator; it shall be created explicitly using
the unary & operator or an integer constant cast to pointer type, or implicitly by the use of
an expression of array or function type.
显然,address constant是有类型的,和指针的运算规则相关。作为整数(数学概念)的地址,和指针运算的规则无关。
讨论C语言问题,要是单独说address,也没多大问题。只是应当注意C语言中没有再定义address的概念,address仍然应该指的是不考虑类型的整数。初学者如果不注意,可能会把两者混用——特别是用“地址”同时作为这两个不同概念的中文表述。
这显然是有问题的。例如:
int a[2] = {1};
要是说&a[0]得到的是一个“地址”(字面的说,是address,但严格意义上不是——它的类型在这里不能被忽略),那么“&a[0]+1的值是多少”这类问题可能就弄不清了。
其实还有一个问题,就是关于address constant中constant的意义。“地址常量”本身在字面上是没问题的,问题在于——很难描述C语言中所说的“常量”是什么,除非枚举外延(C语言中的常量包含地址常量、字符常量……)。因此有人反对使用“地址常量”这个译名(address constant是标准中定义的,大概不好反对;尽管这种定义确实很奇怪,容易产生误解),而用“地址”代替。上面已经提到过,C语言没有特别规定地址是什么,要表达“地址空间中的一个整数”这个意义时,“地址”是没有问题的;但是若在只能用address constant而不能用address的场合中用“地址”代替address constant,那就是一种误用。这种误用似乎还挺常见。于是学习者更加容易弄不清了。
(PS.我个人认为address constant是C语言中不必要出现的概念,直接用pointer来描述就行了——当然另外还要补充一下operator&的语义描述,如ISO C++风格的“unary operator & returns a pointer”之类。)
你的意思是学了计算机原理之类的基础课程,学习C更难了?
mirnshi 发表于 2010-12-09 10:55
在这些个别的概念上确实是这样。
另外,使用思维方式有较大的不同,也可能会造成一定的困难。不过这些课程本来就是要解决属于不同的领域(尽管有些相关)的问题,所以学习者应该可以理解到差异而不至于造成很大麻烦。 |
|