int a[2][3];
cout << a+1 << " " << a << " " << (a+1) - a << endl;
输出:
0029FAC0 0029FAB4 1
不应(a+1)-a
为0029FAC0-0029FAB4=12
?
答案 0 :(得分:9)
不,因为指针算术缩放取决于你指向的东西。在这种情况下,您指向一个三元素的整数数组,每个长度为四个字节,总共十二个字节。但是,这会缩减为算术中的一个“元素”。
在打印0029FAC0
时,与0029FAB5
而不是0029FAB4 + 1
(a+1
缩放时)相同的原因相同。< / p>
如果您将输出行更改为:
cout << a+1 << " "
<< a << " "
<< (a+1) - a << " "
<< (int)(a+1)-(int)(a) << endl;
你会看到缩放在最后一个词中消失,因为它不再是指针的减法:
0xbfaa0ad4 0xbfaa0ac8 1 12
请注意,a+1
中的(int)(a+1)
仍然是,因为a
仍然是指针。这只是减法没有缩放,因为在那一点上,两个值都已转换为整数(通常的注意事项适用于指针和整数之间的转换,这对我的特定实现是安全的,但C99并没有强制要求)。
答案 1 :(得分:1)
就像(pointer + N)
指向指针参数后的第N个数据元素一样,以(pointerA - pointerB)
向另一个方向指向,可以得到指针之间的数据元素数。在这种情况下,数据元素是int[3]
(您显然已经知道了,因为您期望12 ...)。
您不应该期望原始地址值的差异(一般来说,这取决于机器)。 C / C ++正在为您转换。
答案 2 :(得分:0)
我认为编译器正在将其更改为常量。
尝试b = a + 1
,然后cout << b << b - a << endl;
答案 3 :(得分:0)
指针算术仍然是有效的算术; - )
与有效算术一样,它保留(x+1)-x = x - x + 1 = 1
。
因此,在您的情况下,(a+1)
表示不是指向数组的第二个元素的指针,而是指向数组结尾之后的字节的指针。
答案 4 :(得分:0)
当你打印出一个指针时,它基本上是使用字节地址隐式地转换为一个整数来显示。
当你减去指针时,结果是ptrdiff_t
,它已经是一个整数类型。您只能减去相同类型的指针,并在计算中考虑sizeof
类型。结果是两个指针之间的元素数量,而不是字节数。 (请记住,如果两个指针没有指向同一个数组,则减法是未定义的行为。)
在你的情况下,指针类型是“指向3个int数组的指针”,你的两个指针是两个相邻的元素,其中包含2个数组(3个int的数组)。它们相距1个元素,但相隔12个字节。
答案 5 :(得分:-3)
为什么会是12?
x+1-x=y
y不可能是12,是指针算术或整数。