我一直认为&运算符给出了变量指向的内存的地址。我目前正在查看,发现了以下内容,这让我很困惑。

但是,& 强制转换表达式是指针,而不是地址。ISO C 不要求指针(或强制转换为 int 的指针)的值是指向的对象的绝对地址 — 尽管通常情况如此

0


最佳答案
1

实际上,指针就是地址(也许除了一些非常模糊的平台),但它们还有一些额外的限制(编译器可以假设您不做某些事情进行优化,例如不违反严格别名)。

C/C++ 标准记录这些限制的方式是将指针解释为一些抽象实体(根本没有提及地址),并记录对它们允许执行的操作(如果它们只是地址,则是可以执行的操作的子集)。

有些人确实喜欢说“指针不是地址!”来强调这些额外限制的存在,但这是一种相当令人困惑的说法,我更喜欢“带有一些限制的地址”的思维模型。

4

  • 1
    举一个指针不是地址的平台的例子:在 WASM 中,它们是线性内存数组中的索引。这意味着,例如,这0是 WASM 中的有效指针,并且可以读取和写入内存。这也意味着这0是内存的“第一个字节”,1是内存的“第二个字节”。虽然实际上索引基本上只是一个虚拟地址 🙂


    – 


  • @Chad ¯\_(ツ)_/¯ 这符合我对“地址”的定义。如果你正在运行模拟器,我仍然会将其模拟地址称为“地址”。“实际上,索引基本上只是一个虚拟地址”没错。 🙂


    – 


  • @Chad 为什么0不是有效地址?这只是 C 惯例,认为NULL无效。在我使用的许多嵌入式系统中,这是一个有效地址。


    – 

  • 在许多非嵌入式系统中,0这不是一个可以读取或写入的地址。它是受保护的。我提到,与大多数平台相反,在 WASM 上情况并非如此。


    –