我一直认为&
运算符给出了变量指向的内存的地址。我目前正在查看,发现了以下内容,这让我很困惑。
但是,& 强制转换表达式是指针,而不是地址。ISO C 不要求指针(或强制转换为 int 的指针)的值是指向的对象的绝对地址 — 尽管通常情况如此
0
最佳答案
1
实际上,指针就是地址(也许除了一些非常模糊的平台),但它们还有一些额外的限制(编译器可以假设您不做某些事情进行优化,例如不违反严格别名)。
C/C++ 标准记录这些限制的方式是将指针解释为一些抽象实体(根本没有提及地址),并记录对它们允许执行的操作(如果它们只是地址,则是可以执行的操作的子集)。
有些人确实喜欢说“指针不是地址!”来强调这些额外限制的存在,但这是一种相当令人困惑的说法,我更喜欢“带有一些限制的地址”的思维模型。
4
-
1举一个指针不是地址的平台的例子:在 WASM 中,它们是线性内存数组中的索引。这意味着,例如,这
0
是 WASM 中的有效指针,并且可以读取和写入内存。这也意味着这0
是内存的“第一个字节”,1
是内存的“第二个字节”。虽然实际上索引基本上只是一个虚拟地址 🙂
–
-
@Chad ¯\_(ツ)_/¯ 这符合我对“地址”的定义。如果你正在运行模拟器,我仍然会将其模拟地址称为“地址”。“实际上,索引基本上只是一个虚拟地址”没错。 🙂
–
-
@Chad 为什么
0
不是有效地址?这只是 C 惯例,认为NULL
无效。在我使用的许多嵌入式系统中,这是一个有效地址。
– -
在许多非嵌入式系统中,
0
这不是一个可以读取或写入的地址。它是受保护的。我提到,与大多数平台相反,在 WASM 上情况并非如此。
–
|
|