关于(char*)强制转换后指针算术运算结果差异的技术咨询
指针算术的类型依赖性解释
这是C/C++中指针算术的核心规则导致的结果:指针的算术运算(加减、差值计算)不是基于原始地址数值的纯数学运算,而是由指针指向的类型大小决定步长。
先看你给出的测试代码和结果:
int a; (&a+1) - &a: 1 (char*)(&a+1) -(char*)&a: 4
以及地址示例:
&a: 1283454684 &a+1: 1283454688 (char*)&a: 1283454684 (char*)(&a+1): 1283454688
1. 针对int*类型的指针运算
&a是int*类型的指针(指向int变量的指针):
&a + 1:指针加1时,编译器会让地址偏移一个int类型的大小(在你的环境中是4字节),所以&a+1的地址数值比&a大4。(&a+1) - &a:两个同类型指针相减,结果表示的是两者之间相差的元素个数。这里从&a到&a+1刚好跨越了1个int元素,所以结果是1。
2. 强制转换为char*后的指针运算
当你把int*强制转换成char*后,指针的类型变成了指向1字节大小的char类型:
(char*)&a和(char*)(&a+1)的地址数值和之前的&a、&a+1完全一致(都是1283454684和1283454688)。(char*)(&a+1) - (char*)&a:两个char*相减,结果表示的是两者之间相差的字节数。因为地址数值差了4,所以结果是4。
本质原因
指针的类型不仅决定了它能指向什么数据,还决定了编译器如何处理它的算术运算:
- 指针加减整数时,偏移量 = 整数 × 指针指向类型的大小
- 同类型指针相减时,结果 = 地址数值差 ÷ 指针指向类型的大小
所以哪怕两个指针的地址数值完全相同,只要类型不同,算术运算的逻辑就不一样,结果自然不同。
内容的提问来源于stack exchange,提问作者Dheeraj
相关产品推荐
相关产品推荐

