编译器如何知道如何递增不同的指针
How does compiler know how to increment different pointers?
我知道一般来说,指向任何数据类型的指针都会具有相同的大小。在 16 位系统上,通常为 2 个字节,而在 32 位系统上,4 个字节。
根据此指针指向的内容,如果递增,它将递增不同的字节数,具体取决于它是字符指针、长指针等。
我的问题是编译器如何知道增加此指针的字节数。它不就是一个像其他变量一样存储在内存中的变量吗?指针是否存储在某个符号表中,其中包含有关它们应递增多少的信息?谢谢
这就是为什么有数据类型。每个指针变量都有一个关联的数据类型,并且该数据类型具有定义的大小(请参阅脚注中关于完整/不完整类型)。指针算术将根据数据类型进行。
除此之外,要进行指针算术,指针应该是(引用自c11
标准)
指向完整对象类型的指针
因此,指针指向的"对象"的大小是已知和定义的。
脚注:FWIW,这就是为什么标准中不允许/定义空指针(不完整类型)上的指针算术。(尽管GCC通过扩展支持void指针算法。
re
"我知道一般来说,指向任何数据类型的指针都会具有相同的大小
不。对于指向对象的简单指针,不同的指针大小是不寻常的,但在字寻址计算机上可能会出现。然后char*
是最大的指针,void*
是相同的大小。
" cv
void*
类型的对象应具有相同的 作为简历char*
的表示和对齐要求。
但是,指向类类型对象的所有指针的大小都相同。例如,如果不是这种情况,您将无法使用指向基类型的指针数组。
再
" 编译器如何知道递增此指针的字节数
它知道指向的对象类型的大小。
如果它不知道指向的对象的大小,即该类型不完整,则无法递增指针。
例如,如果p
是void*
,则无法执行++p
。
笔记:
¹ 除了指向对象的普通指针外,还有函数指针和指向成员的指针。后一种更像是偏移量,必须与相关对象的某些规范相结合,以产生参考。
指针变量的数据类型定义要递增的字节数。
例如:1) 在递增字符指针时,指针递增 1 个字节。2) 同样,对于整数指针,指针递增 4 字节(对于 32 位系统)和 8 字节(对于 64 位系统)
- 在C++中释放内存期间,迭代器与指针有何不同
- 按引用调用与按指针参数调用的差异 前递增和后递增
- 分配值时,C++ char* 指针上的前递增与后递增
- 字符指针不递增?
- 递增空指针无法正确设置值
- 为什么在递增后使用 [] 运算符访问指针数组会返回错误地址的当前内存位置
- 为什么指针不能指向张贴增量,而可以这样做才能预先递增
- 指向成员函数的指针与指向数据成员的指针有何不同
- 指针算术递增修复后/修复前
- 对齐方式与指针中尾随零的数量有何关系
- 为什么递增指针会给出一个随机数,而不是内存地址
- 当我递增指针然后将其删除时,为什么我的程序会崩溃
- 当我们递增下面的类型转换指针时会发生什么?
- (C++)通过指针递增,或者:为什么这不起作用?指针->int = 指针->int+1;
- 正在递增定义良好的空指针
- 为什么在使用类似的逻辑递增两种不同的指针类型时得到不同的地址
- int类型的指针在递增后移动内存中的1个地址
- 为什么指针不递增
- 读取指针时递增指针
- c++中指针的递增和解引用顺序