据我所知,通常,指向任何数据类型的指针都具有相同的大小。在16位系统上,通常为2个字节,在32位系统上为4个字节。
取决于该指针指向的内容,如果它递增,它将增加不同的字节数,具体取决于它是否为char指针,长指针等。
我的查询是编译器如何知道增加此指针的字节数。它不仅仅是存储在内存中的变量吗?指针是否存储在某个符号表中,其中包含有关它们应增加多少的信息?谢谢
答案 0 :(得分:2)
这就是数据类型的原因。每个指针变量都将具有关联的数据类型,并且该数据类型具有已定义的大小(请参阅脚注中的完整/不完整类型)。指针算法将根据数据类型进行。
除此之外,为了使指针算法发生,指针应该是(引自c11
标准)
指向完整对象类型的指针
所以,"对象的大小"指向的指针是已知和定义的。
脚注:FWIW,这就是为什么在标准中不允许/定义无效指针(不完整类型)的指针算法。 (Though GCC supports void pointer arithmetic via an extension.)
答案 1 :(得分:1)
RE
“我理解一般来说,指向任何数据类型的指针都会有相同的大小
没有。对于指向对象的¹simple指针,不同的指针大小是不寻常的,但可以在单词寻址机器上发生。然后char*
是最大的指针,void*
的大小相同。
“ cv
void*
类型的对象应具有相同的对象 表示和对齐要求为 cvchar*
。
所有指向类类型对象的指针都是相同的大小。例如,如果不是这种情况,您将无法使用指向基类型的指针数组。
RE
“编译器如何知道递增此指针的字节数
它知道指向的对象类型的大小。
如果它不知道指向的对象的大小,即该类型不完整,则无法递增指针。
例如,如果p
是void*
,则您无法++p
。
注意:
¹除了指向对象的普通指针外,还有函数指针和指向成员的指针。后一类更像是偏移,必须与相关对象的某些规范相结合,以产生参考。
功能
答案 2 :(得分:0)
指针变量的数据类型定义要递增的字节数。
例如: 1)在递增字符指针时,指针增加1个字节。 2)同样,对于整数指针,指针增加4个字节(对于32位系统)和8个字节(对于64位系统)