用指针给数组赋值的一个小问题
来源:互联网 发布:蜘蛛侠战斗力知乎 编辑:程序博客网 时间:2024/05/22 09:41
问题是这样的, 我打算输入与元素为数组赋值, 然后反向输出数组元素
/*
注释掉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]。
# 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 的拷贝下执行 * 操作。
阅读全文
2 0
- 用指针给数组赋值的一个小问题
- 关于数组给指针赋值的问题
- 关于 将一个数组赋值给另外一个数组会重置原来数组的指针 的问题
- [C语言]给一个二维字符数组赋值的问题
- scanf能赋值字符数组,不能赋值给指针的问题
- 指针数组,字符数组----一个很有趣的小问题
- 指针数组赋值问题
- 数组给数组赋值问题
- 关于未指针数组赋值的问题
- 关于数组与指针的一个小问题
- 如何理解字符串赋值给指针与数组的区别
- 字符串赋值给指针与数组的区别
- 关于一个给二维数组循环赋值问题的本渣研究出的解决办法[C#]
- 给结构里的char指针赋值的一个难点
- 对空指针赋值的问题 指针的指针 指针的指针和指针数组
- 一个变量赋值的小问题
- 指针的一个小问题
- 我写的一个给time_t赋值的小函数
- javascript 之Rest 参数(...)
- jstl functions标签详细使用说明
- 深度学习和机器学习概念入门
- hdu 5727 Necklace 状压dp/二分图匹配
- mac和windows开发工具对比
- 用指针给数组赋值的一个小问题
- VS调试报错 “error LNK2019: 无法解析的外部符号 ......”
- 扩展欧几里得
- bellman-ford的理解
- LeetCode two sum
- 一个旋转物体的脚本
- C#获取oracle中某个用户的所有表
- centos7 安装jdk
- Intent的初体验