编译器如何知道如何增加不同的指针?

时间:2016-04-22 10:08:20

标签: c++ c pointers pointer-arithmetic

据我所知,通常,指向任何数据类型的指针都具有相同的大小。在16位系统上,通常为2个字节,在32位系统上为4个字节。

取决于该指针指向的内容,如果它递增,它将增加不同的字节数,具体取决于它是否为char指针,长指针等。

我的查询是编译器如何知道增加此指针的字节数。它不仅仅是存储在内存中的变量吗?指针是否存储在某个符号表中,其中包含有关它们应增加多少的信息?谢谢

3 个答案:

答案 0 :(得分:2)

这就是数据类型的原因。每个指针变量都将具有关联的数据类型,并且该数据类型具有已定义的大小(请参阅脚注中的完整/不完整类型)。指针算法将根据数据类型进行。

除此之外,为了使指针算法发生,指针应该是(引自c11标准)

  

指向完整对象类型的指针

所以,"对象的大小"指向的指针是已知和定义的。

脚注:FWIW,这就是为什么在标准中不允许/定义无效指针(不完整类型)的指针算法。 (Though GCC supports void pointer arithmetic via an extension.)

答案 1 :(得分:1)

RE

  

我理解一般来说,指向任何数据类型的指针都会有相同的大小

没有。对于指向对象的¹simple指针,不同的指针大小是不寻常的,但可以在单词寻址机器上发生。然后char*是最大的指针,void*的大小相同。

C ++14§3.9.2/ 4
  

cv void*类型的对象应具有相同的对象   表示和对齐要求为 cv char*

所有指向类类型对象的指针都是相同的大小。例如,如果不是这种情况,您将无法使用指向基类型的指针数组。

RE

  

编译器如何知道递增此指针的字节数

它知道指向的对象类型的大小。

如果它不知道指向的对象的大小,即该类型不完整,则无法递增指针。

例如,如果pvoid*,则您无法++p

注意:
¹除了指向对象的普通指针外,还有函数指针和指向成员的指针。后一类更像是偏移,必须与相关对象的某些规范相结合,以产生参考。 功能

答案 2 :(得分:0)

指针变量的数据类型定义要递增的字节数。

例如: 1)在递增字符指针时,指针增加1个字节。 2)同样,对于整数指针,指针增加4个字节(对于32位系统)和8个字节(对于64位系统)