问题是这样的, 我打算输入与元素为数组赋值, 然后反向输出数组元素
# include <stdio.h>
int main(void)
{
int a[10], * p = a, i;
for (i = 0; i < 10; i++)
scanf("%d", p++);
for(i = 9; i >= 0; i--) // 用指针输出时, i 仅仅用来控制循环次数,
{
// *p-- 相当于 *p, p-- // 10
// printf("%d ", *p); // 11
// p--; // 12
// printf("%d ", *p--); // 13
printf("%d ", a[i]);
}
return 0;
}
输出结果如下:
/*
注释掉13 行输出结果:
0 1 2 3 4 5 6 7 8 9
9 9 8 7 6 5 4 3 2 1
注释掉11, 22行输出结果:
0 1 2 3 4 5 6 7 8 9
9 9 8 7 6 5 4 3 2 1
注释掉11, 12, 13行输出结果:
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
*/
因为开始的输出结果不符合我的期望, 所以我就 用不同的 方法输出。
结果是: 用数组方法输出是正确的, 但是用指针的方法却是error。
这时候 我有两个疑惑,
第一: p是个指针。
*p++ 相当于 *p, p++; 这个是我结论刚实验的。 // 见上面程序。
但是教材上说的是, *p++, 因为 * 运算符与++yu==运算符处于同优先级,
结合方向自右向左。因此等价于*(p++);
问题就来了, *p++, 到底是先算那个?
第二:我觉得上面三种输出的方式的结果应该都是一样的, 但是输出的却不一样。
我用指针输出时,
for循环第一次时, p = &a[9]; 输出a[9]的值; 然后 p–; 此时 p = &a[8];
第二次时, p = &a[8]; 输出a[8]的值; 然后p–; 此时p = &a[7];
………………
知道p = &a[0]; 输出a[0]的值; p–; 此时因为 i 已经不满足for的条件了, 跳出循环。
然而: 事实却是上面的结果。
对于第二个问题。 因为是指针输出的时候结果出错, 于是我想到是不是指针指向的地址不是我预料中的。我用下面的程序来验证我的思路。
for (i = 0; i < 10; i++)
{
printf("%#x\n", &a[i]);
}
printf("\n\n%#x\n", p);
输出结果是:
0x60fee0
0x60fee4
0x60fee8
0x60feec
0x60fef0
0x60fef4
0x60fef8
0x60fefc
0x60ff00
0x60ff04
0x60ff08
可以清晰地看到, 给数组赋完值之后, p 的值并不是我想象中的 &a[9], 而是 &a[10]。
所以, 问题的根本原因是因为
for (i = 0; i < 10; i++)
scanf(“%d”, p++);
输入所有的值之后, p++; 导致 p 指向不是a[9]。
对于第一个问题,优先级表格显示后缀++操作符的优先级高于操作符*, 但是这里实际上涉及三个步骤:
(1) ++操作符产生 p 的一份拷贝。
(2)然后++操作符增加 p 的值。
(3)最后在 p 的拷贝下执行 * 操作。