在Jens Gustedt的《现代C》一书中,作者做了以下陈述:,

  1. 在下面的小节中,我们将介绍句法方面(语法)和三种不同的语法
  1. The declarations of i and A declare variables , which are named items that allow us to store values. They are best visualized as a kind of box that may contain a “something” of a particular type: enter image description here

从概念上讲,区分盒子本身(对象)、规范(类型)、盒子内容(值)以及写在盒子上的名称或标签(对象)很重要

  1. 通常,声明只指定对象的类型和标识符

--QUESTIONS REGARDING THE AFOREMENTIONED STATEMENTS--

问题1.-作者的第一句和第三句话意味着定义指定了标识符所指对象的位置.这里的"where"是什么意思,尤其是在定义中指定标识符的具体值与标识符所指对象的位置相同/不同?

问题2.-从语句2中可以看出,"从概念上讲,区分盒子本身(对象)、规范(类型)、盒子内容(值)以及写在盒子上的名称或标签(标识符)很重要."意思是为什么"盒子"是一个对象而不是"盒子"中的值?

推荐答案

首先,如果你是一个完全的初学者,你不需要担心所有这些肮脏的细节——简单地说,把一个对象看作一个变量.初学者可以在这里停止阅读,因为剩下的答案是一个高级主题.


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的一部分,该主题与指针别名有关.古斯特在写这一章的时候,很可能已经考虑到了这个特殊的规则.

C++相关问答推荐

为什么已经设置的值在C中被重置为for循环条件中的新值?

如何创建由符号组成的垂直结果图形?

数据包未从DPDK端口传输到内核端口

堆栈帧和值指针

为什么内核使用扩展到前后相同的宏定义?

在C中将通用字符名称转换为UTF-8

Can函数指针指向C++中具有不同参数连续性的函数

为什么我不能只在内存地址中添加一个int来寻址任何数组?

函数的限制限定指针参数允许优化调用方函数吗?

SSH会话出现意外状态

&;(str[i])和(&;str)[i]有什么区别?

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

变量的作用域是否在C中的循环未定义行为或实现定义行为的参数中初始化?

MacOS下C++的无阻塞键盘阅读

为什么我在C代码中得到一个不完整的类型?

将某些内容添加到链接列表时,列表中的其他项将使用最后添加的项的名称

try 判断长整数是否为素数

如何编写postgresql支持函数

如何在C中计算包含递增和递减运算符的逻辑表达式?

在带中断的循环缓冲区中使用 易失性