如何理解输出?

lex*_*lex 2 c++

int a[2][3];
cout << a+1 << " " << a << " " << (a+1) - a << endl;
Run Code Online (Sandbox Code Playgroud)

输出:

0029FAC0 0029FAB4 1
Run Code Online (Sandbox Code Playgroud)

(a+1)-a应该0029FAC0-0029FAB4=12

pax*_*blo 9

不,因为指针算术根据您指向的东西进行缩放.在这种情况下,您指向一个三元素的整数数组,每个长度为四个字节,总共十二个字节.但是这会缩减到算术中的一个"元素".

这与你在打印时获得0029FAC0而不是0029FAB5(0029FAB4 + 1当它没有缩放时)相同的原因a+1.

如果将输出行更改为:

cout << a+1                 << " "
     << a                   << " "
     << (a+1) - a           << " "
     << (int)(a+1)-(int)(a) << endl;
Run Code Online (Sandbox Code Playgroud)

你会看到缩放在最后一个词中消失,因为它不再是指针的减法:

0xbfaa0ad4 0xbfaa0ac8 1 12
Run Code Online (Sandbox Code Playgroud)

请记住,a+1in 仍然(int)(a+1) 缩放的,因为a它仍然是指针.它只是没有缩放的减法,因为在这一点上,两个值都已转换为整数(通常的注意事项适用于指针和整数之间的转换,这对我的特定实现是安全的,但C99并没有强制要求).

  • @lex,对不起,我以为我会说清楚 - 即使它是12 _bytes_,那就缩小到1 _element_. (2认同)