首先,如果你是一个完全的初学者,你不需要担心所有这些肮脏的细节——简单地说,把一个对象看作一个变量.初学者可以在这里停止阅读,因为剩下的答案是一个高级主题.
C中object的正式定义(C17 3.15):
object
region of data storage in the execution environment, the contents of which can represent values
"where"在这里是什么意思
这意味着,根据定义,一个对象被分配了一个内存位置——至少是一个相对位置,之后链接器将其转换为一个绝对地址.
特别是,在定义中指定标识符的具体值与标识符所指的对象的位置如何相同/不同?
从语句2中可以看出,"从概念上讲,区分盒子本身(对象)、规范(类型)、盒子内容(值)以及写在盒子上的名称或标签(标识符)很重要."意思是为什么"盒子"是一个对象而不是"盒子"中的值?
为了一次回答所有这些问题,有几种方法可以在C中创建对象.最明显的方法是int i=0;
,其中对象同时获得一个类型、一个值和一个标识符.但在动态分配的情况下,情况就不同了.
拿int* p = malloc(sizeof *p)
块.
malloc
返回指向未命名对象的指针.对象的名称不是p
,因为这是pointer的名称(它本身也是一个对象)——对象本身没有相应的标识符.
- 按照C的类型规则,返回的地址没有声明的类型,因此对象还没有类型.
- 此时,对象的值也是不确定的.
在这种情况下,在执行*p = 1;
之前,对象既没有类型也没有值.之后,对象得到了类型int
和值1
,因为我们在进行写访问时使用了int
.这个动态分配的例子是一个有点高级的主题effective type的一部分,该主题与指针别名有关.古斯特在写这一章的时候,很可能已经考虑到了这个特殊的规则.