C - void* 将具有与指向 char 的指针相同的表示形式和内存对齐方式



我正在读一本关于指针的书,名为">理解和使用c指针">

当谈到void *它说

它有两个有趣的属性:

指向 void 的指针
  1. 将与指向 char 的指针具有相同的表示形式和内存对齐方式。

我感到困惑的是,所有指针的记忆不是都一样吗?他们为什么不是写 void* 而是与普通指针相同,而是明确提到了字符指针?将非常感谢任何帮助

在最常见的体系结构中,指向任何数据类型的指针具有相同的表示形式,而指向函数的指针可能不同。但是,这不是必需的,因此可以创建有效的 C 实现,该实现对不同的数据类型使用不同的指针。这背后的原因是C标准倾向于只描述关键需求,为可能的实现留下了很大的自由。以下是标准的内容:

指向void的指针应具有与 指向字符类型的指针。 同样,指向限定或非限定版本的指针 兼容类型应具有相同的表示和对齐要求。都 指向结构类型的指针应具有相同的表示和对齐要求 彼此之间。指向联合类型的所有指针应具有相同的表示形式,并且 相互对齐的要求。指向其他类型的指针不必相同 表示或对齐要求。

如果你想知道不同数据类型的不同大小的系统示例,这个问题提到了这些精彩的例子

我认为这里的重点是"内存对齐",而不是"内存大小"。

是的,所有指针都具有相同的内存大小。但它们可能对内存对齐有不同的限制。

例如,在某些平台上,"32 位 int"指针必须指向地址,该地址应为 4 个字节的时间。它不能指向,例如0x100001或0x100003。

但是"8 位字符"指针可以指向任何地址。"空"指针也是如此。

所以它这么说。

最新更新