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

How does compiler know how to increment different pointers?

本文关键字:指针 何递增 何知道 编译器      更新时间:2023-10-16

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

根据此指针指向的内容,如果递增,它将递增不同的字节数,具体取决于它是字符指针、长指针等。

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

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

除此之外,要进行指针算术,指针应该是(引用自c11标准)

指向完整对象类型的指针

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

脚注:FWIW,这就是为什么标准中不允许/定义空指针(不完整类型)上的指针算术。(尽管GCC通过扩展支持void指针算法。

re

"我知道一般来说,指向任何数据类型的指针都会具有相同的大小

不。对于指向对象的简单指针,不同的指针大小是不寻常的,但在字寻址计算机上可能会出现。然后char*是最大的指针,void*是相同的大小。

C++14 §3.9.2/4

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

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


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

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

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

例如,如果pvoid*,则无法执行++p

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

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

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