指针算术和转换

时间:2018-12-05 00:59:49

标签: c++ pointer-arithmetic

short x = 5;        
short*ptr = &x;     
short *ptr2 = ptr+5; 

cout << ptr2 - ptr << endl;
cout << (long) ptr2 - (long)ptr << endl;

我知道指针存储地址,但是我不明白为什么这两行的答案都不是10。

ptr2 =指针地址+ sizeof(short)* 5吗?

3 个答案:

答案 0 :(得分:1)

内存地址可能相隔十个字节,但这不是指针加法/减法的工作原理。使用的值根据数据类型的大小进行缩放,因此,对于两字节的short,这些值将是您实际内存地址期望值的一半(如果您的数据类型是一个字节char,它将按您期望的那样工作。)

pointer + 4加法的确没有什么不同,该加法为您提供了数组中第五个元素的地址,而不是的地址是指针之后的五个字节。

这在标准的[expr.add]部分(来自C++17的文本)中进行了介绍:

  

当减去指向同一数组对象元素的两个指针时,结果的类型为实现定义的带符号整数类型;此类型应与在std::ptrdiff_t标头(21.2)中定义为<cstddef>的类型相同。

     

如果表达式PQ分别指向同一数组对象x[i]的元素x[j]x,则表达式{{1 }} 具有值P - Q; ,否则,行为是不确定的。


当然,无论如何这都是有待解决的问题,因为根据该报价,您正在做的事情是不确定的行为。除非两个指针都在同一个数组中(或在所述数组之外的一个字节内),否则不定义指针减法。

答案 1 :(得分:1)

指针算术以要指向的类型的元素表示。

i − jptr+5递增ptr个字节。

5 * sizeof(short)的结果为5,因为编译器知道ptr2 - ptrptr指向ptr2元素,因此将两个内存的差值相除地址short。这两个内存地址之间的sizeof(short)元素数为5。

short不是指针算法,而只是普通的普通整数算法。它按原样计算2个内存地址的差,而不考虑它们指向的是什么。由于两个内存地址之间有5个(long) ptr2 - (long)ptr元素,并且在您的情况下short显然为2个字节,因此两个内存地址之间的距离为10个字节。

答案 2 :(得分:0)

指针算法的确具有代数性。

如果y = x + 5,则y-x =5。如果x和y是整数,或者x和y是指向同一类型的指针,则为true。

请注意,不能使用指针执行z = y + x。 z不等于2x +5。甚至不编译。您不能添加两个指针,但是可以取两个指针之间的差(并获取元素数)。