我正在读一本关于指针的书,名为">理解和使用c指针">
当谈到void *
它说
它有两个有趣的属性:
指向 void 的指针
- 将与指向 char 的指针具有相同的表示形式和内存对齐方式。
我感到困惑的是,所有指针的记忆不是都一样吗?他们为什么不是写 void* 而是与普通指针相同,而是明确提到了字符指针?将非常感谢任何帮助
在最常见的体系结构中,指向任何数据类型的指针具有相同的表示形式,而指向函数的指针可能不同。但是,这不是必需的,因此可以创建有效的 C 实现,该实现对不同的数据类型使用不同的指针。这背后的原因是C标准倾向于只描述关键需求,为可能的实现留下了很大的自由。以下是标准的内容:
指向void的指针应具有与 指向字符类型的指针。 同样,指向限定或非限定版本的指针 兼容类型应具有相同的表示和对齐要求。都 指向结构类型的指针应具有相同的表示和对齐要求 彼此之间。指向联合类型的所有指针应具有相同的表示形式,并且 相互对齐的要求。指向其他类型的指针不必相同 表示或对齐要求。
如果你想知道不同数据类型的不同大小的系统示例,这个问题提到了这些精彩的例子
我认为这里的重点是"内存对齐",而不是"内存大小"。
是的,所有指针都具有相同的内存大小。但它们可能对内存对齐有不同的限制。
例如,在某些平台上,"32 位 int"指针必须指向地址,该地址应为 4 个字节的时间。它不能指向,例如0x100001或0x100003。
但是"8 位字符"指针可以指向任何地址。"空"指针也是如此。
所以它这么说。