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

我正在读一本关于“ 理解和使用c指针 ”的指针的书

谈到void *它说

它有两个有趣的属性:

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

令人困惑的是不是所有指针的记忆都相同吗? 他们为什么不代表写入void *与普通提到的char指针的普通指针相同? 真的很感激任何帮助

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

指向void的指针应具有与指向字符类型的指针相同的表示和对齐要求。 同样,指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求。 所有指向结构类型的指针都应具有相同的表示和对齐要求。 所有指向union类型的指针都应具有相同的表示和对齐要求。 指向其他类型的指针不需要具有相同的表示或对齐要求。

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

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

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

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

但是“8位字符”指针可以指向任何地址。 “void”指针也是如此。

所以它说。