【发布时间】:2013-05-24 16:01:25
【问题描述】:
我有一个 C++ 函数,我知道会是什么,但为什么?
int c[5];
int* pc = c;
for (int i = 0; i < 5; i++)
{
c[i] = i*2;
}
*pc++;
printf("%d\n", pc-c );
【问题讨论】:
我有一个 C++ 函数,我知道会是什么,但为什么?
int c[5];
int* pc = c;
for (int i = 0; i < 5; i++)
{
c[i] = i*2;
}
*pc++;
printf("%d\n", pc-c );
【问题讨论】:
有很多垃圾代码在发生。这是唯一对打印很重要的事情:
int c[5]; // c is a pointer
int* pc = c; // pc points to the same thing as c.
pc++; // pc now points to one-past-where-c-points-to
printf("%d\n", pc-c ); // will print the pointer differences. 1.
注意
*pc++;
其实就是
*(pc++);
与
不同(*pc)++;
如有疑问,请始终使用括号。
【讨论】:
地址距离
似乎代码试图在内存寻址空间中显示指针pc 到c 的距离。
int* pc = c; : pc 指向 c 指向的位置。 (这里pc = c)
*pc++;:pc增加了一个(这里是pc = c + 1)
pc - c : pc - c = 1 : 距离(它们之间的整数个数)
+------+------+------+------+------+
| | | | | |
+------+------+------+------+------+
^ ^
c pc
您可以在 C++ 标准的 §5.7 中阅读定义明确的指针算法 [expr.add]。
【讨论】:
%d 也是如此。
pc-c、pc指向c[1],所以pc-c是1。传递给printf的参数不是指针;这是ptrdiff_t。
pc-c 是 ptrdiff_t 不是指针,它可能匹配也可能不匹配 %d。
输出是1,因为它减去地址并返回差值
【讨论】: