gpt4 book ai didi

c++ - 指针运算和转换

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:20 26 4
gpt4 key购买 nike

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 吗?

最佳答案

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

它真的和pointer + 4没什么区别|加法给出数组中第五个元素的地址,不是指针前五个字节的地址。

这包含在 [expr.add] 中标准部分(来自 C++17 的文本):

When two pointers to elements of the same array object are subtracted, the type of the result is an implementation-defined signed integral type; this type shall be the same type that is defined as std::ptrdiff_t in the <cstddef> header (21.2).

If the expressions P and Q point to, respectively, elements x[i] and x[j] of the same array object x, the expression P - Q has the value i − j; otherwise, the behavior is undefined.


当然,无论如何,这在您的案例中是一个有争议的问题,因为根据该引述,您正在做的是未定义的行为。除非两个指针都在同一数组内(或超出所述数组一个字节),否则不会定义指针减法。

关于c++ - 指针运算和转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53623664/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com