数组中指针相减:应按索引相减还是地址相减?
指针相减结果的疑问
- ptr1存储
arr[0]的地址,ptr2存储arr[3]的地址 - 疑问:
(ptr2-ptr1)难道应该是(3*4 - 0*4)(地址直接相减)而非索引相减?答案难道不应该是第二个问题的结果吗?
解答
在C语言中,同类型指针相减的结果是两者之间的元素个数(索引差值),而非字节地址的直接差值,这是指针运算的既定规则:
- 指针运算会自动适配指向类型的内存大小,比如
float*类型指针,每个元素占4字节 ptr2 - ptr1的计算逻辑为:(ptr2的地址值 - ptr1的地址值) / sizeof(float)- 对应你的例子,地址差为
3*4=12字节,除以sizeof(float)=4,最终结果为3,也就是索引的差值
如果需要获取字节层面的地址差值,需要将指针强制转换为char*类型后再相减:
(char*)ptr2 - (char*)ptr1 // 结果为12
内容的提问来源于stack exchange,提问作者Padmesh Sharma
相关产品推荐
相关产品推荐

