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吗?
答案 0 :(得分:1)
内存地址可能相隔十个字节,但这不是指针加法/减法的工作原理。使用的值根据数据类型的大小进行缩放,因此,对于两字节的short
,这些值将是您实际内存地址期望值的一半(如果您的数据类型是一个字节char
,它将按您期望的那样工作。)
与pointer + 4
加法的确没有什么不同,该加法为您提供了数组中第五个元素的地址,而不是的地址是指针之后的五个字节。
这在标准的[expr.add]
部分(来自C++17
的文本)中进行了介绍:
当减去指向同一数组对象元素的两个指针时,结果的类型为实现定义的带符号整数类型;此类型应与在
std::ptrdiff_t
标头(21.2)中定义为<cstddef>
的类型相同。如果表达式
P
和Q
分别指向同一数组对象x[i]
的元素x[j]
和x
,则表达式{{1 }} 具有值P - Q
; ,否则,行为是不确定的。
当然,无论如何这都是有待解决的问题,因为根据该报价,您正在做的事情是不确定的行为。除非两个指针都在同一个数组中(或在所述数组之外的一个字节内),否则不定义指针减法。
答案 1 :(得分:1)
指针算术以要指向的类型的元素表示。
i − j
将ptr+5
递增ptr
个字节。
5 * sizeof(short)
的结果为5,因为编译器知道ptr2 - ptr
和ptr
指向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。甚至不编译。您不能添加两个指针,但是可以取两个指针之间的差(并获取元素数)。