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

时间:2017-03-29 11:18:37

标签: c pointers memory-alignment

我正在读一本名为“理解并使用c指针”的指针

说到void *,它说

  

它有两个有趣的属性:

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

令人困惑的是,所有指针的内存是否相同?他们为什么而不是写void *与它明确提到的char指针的普通指针相同?非常感谢任何帮助

2 个答案:

答案 0 :(得分:5)

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

  

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

如果您有兴趣查看针对不同数据类型的不同大小的系统示例,this question提及these wonderful examples

答案 1 :(得分:-2)

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

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

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

但是" 8位字符"指针可以指向任何地址。一个" void"指针。

所以它说。