用指针给数组赋值的一个小问题
2017-06-03 11:28
483 查看
问题是这样的, 我打算输入与元素为数组赋值, 然后反向输出数组元素
/*
注释掉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的条件了, 跳出循环。
然而: 事实却是上面的结果。
对于第二个问题。 因为是指针输出的时候结果出错, 于是我想到是不是指针指向的地址不是我预料中的。我用下面的程序来验证我的思路。
输出结果是:
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 的拷贝下执行 * 操作。
# 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 的拷贝下执行 * 操作。
相关文章推荐
- 关于 将一个数组赋值给另外一个数组会重置原来数组的指针 的问题
- 一个关于指针间赋值及间接求值的问题
- 常量指针运用, 指针和数组名的赋值,以及各自的内存空间问题 浅谈 !
- [C语言]给一个二维字符数组赋值的问题
- 数组指针的赋值与输出问题
- C语言中sizeof对数组和对指针操作的不同,以及sizeof中表达式赋值问题
- C++ new一个数组时,指针移动程序崩溃问题
- 指针数组赋值问题
- 关于数组与指针的一个小问题
- 小小的C语言问题指针数组赋值----关于指针和数组。
- 安卓按键 :数组之间的赋值 如果修改任意一个数组 会导致其他数组的值也会发生变化的问题
- char数组和指针与CString之间的赋值问题
- 指针数组赋值问题
- 一个字符数组赋值的问题
- C语言指针问题,初始化,赋值,以及字符数组,字符串常量等问题
- 关于数组给指针赋值的问题
- 解决vc++DEBUG ERROR问题前几天师弟调试程序的时候出现了这样一个错误,出错的位置是在delete [] 一个动态分配的数组时出现的。 经过调查发现错误是因为他之前在给数组赋值的时候越界了
- scanf能赋值字符数组,不能赋值给指针的问题
- 对空指针赋值的问题 指针的指针 指针的指针和指针数组
- C语言的一个笔试题:指针与数组的问题