这个问题有点傻,但我认为很有趣。
我正在尝试使用指针和对齐,并想知道是否可以减去两个不同的指针,每个指针指向不同数组中的项目。
两个指针相减通常会产生一个值,该值表示数组中两个项之间的元素数量。
例如,这里有一些按预期工作的有效代码:
unsigned short *p_short = new unsigned short[100];
unsigned short *p_1 = &p_short[10];
unsigned short *p_2 = &p_short[20];
std::cout << p_2 - p_1 << std::endl;
// should produce the value `10`.
// There are 10 `unsigned short`s between the
// two pointers.
// Note: NOT `20`. The subtraction does not
// calulate the number of bytes between the
// two pointers.
- 如果数组是不同类型的数组,则不可能。这会产生类型错误。
- 如果指针是同一类型,但指向不同数组的元素,这是可能的。
然而,后一种情况,减法的结果有意义吗?
可能的输出示例:这是一个可能不会产生有意义的结果的示例。
auto p1 = new unsigned short[100];
auto p2 = new unsigned short[100];
std::cout << p2 - p1 << std::endl;
输出:104
。
(然而我也看到了其他值,例如-6148914691236517216
。)
结果不仅毫无意义,而且会导致未定义的行为:
来自[expr.add]:
指向不同数组中项的指针之间的任何指针算术都将是未定义的行为。
鉴于此,您看到的任何结果都是有效的结果。
减去指向不同对象的两个指针的行为是未定义的。另一个答案之一引用了C ++标准的相关部分。
但是,在大多数平台上,您得到的结果将是指针指向的两个地址之间的差值除以指针指向的对象大小。如果结果为负数,则可能意味着第一个操作数指向的地址低于第二个操作数。