如何理解输出?

时间:2010-12-14 01:45:08

标签: c++

int a[2][3];
cout << a+1 << " " << a << " " << (a+1) - a << endl;

输出:

0029FAC0 0029FAB4 1

不应(a+1)-a0029FAC0-0029FAB4=12

6 个答案:

答案 0 :(得分:9)

不,因为指针算术缩放取决于你指向的东西。在这种情况下,您指向一个三元素的整数数组,每个长度为四个字节,总共十二个字节。但是,这会缩减为算术中的一个“元素”。

在打印0029FAC0时,与0029FAB5而不是0029FAB4 + 1a+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,是指针算术或整数。