我正在读一本名为“理解并使用c指针”的指针
说到void *
,它说
它有两个有趣的属性:
- 指向void的指针将具有与指向char的指针相同的表示和内存对齐。
醇>
令人困惑的是,所有指针的内存是否相同?他们为什么而不是写void *与它明确提到的char指针的普通指针相同?非常感谢任何帮助
答案 0 :(得分:5)
在大多数常见体系结构中,指向任何数据类型的指针具有相同的表示形式,而指向函数的指针可能不同。但是,它不是必需的,因此可以创建有效的C实现,它对不同的数据类型使用不同的指针。这背后的原因是C标准倾向于仅描述关键要求,为可能的实现留下了很大的自由。这是标准所说的:
指向 void 的指针应具有与a相同的表示和对齐要求 指向字符类型的指针。 同样,指向合格或非限定版本的指针 兼容类型应具有相同的表示和对齐要求。所有 指向结构类型的指针应具有相同的表示和对齐要求 彼此相同。所有指向联合类型的指针都应具有相同的表示形式 对齐要求彼此。指向其他类型的指针不必相同 表示或对齐要求。
如果您有兴趣查看针对不同数据类型的不同大小的系统示例,this question提及these wonderful examples
答案 1 :(得分:-2)
我认为这里的重点是"内存对齐",而不是"内存大小"。
是的,所有指针都有相同的内存大小。但是它们可能对内存对齐有不同的限制。
例如,在某些平台上," 32位int"指针必须指向应该是4个字节的地址。它不能指向,例如, 0x100001或0x100003。
但是" 8位字符"指针可以指向任何地址。一个" void"指针。
所以它说。