admin 管理员组文章数量: 887053
区分C语言中的*(p++), *p++, (*p)++, *(++p), *++p
p是一个指针
1.要清楚运算符之间的优先级与结合性:
()运算符,.运算符,++(后缀)运算符的优先级最高,结合方向均为自左向右。
++(前缀)运算符,*运算符的优先级次之,结合方向均为自右向左。
2.要清楚i++ 与 ++i的区别:
分析下面这个程序
include <stdio.h>
int main(void)
{int a = 5, b;b = a++; /*等价于这两条语句b = a; a = a + 1;*/printf("a = %d, b = %d\n", a, b);return 0;
}
猜一猜运行结果会是多少?
没错,运行结果如下:
a = 6, b= 5;
理解了i++后我们再来接着看另一个程序
include <stdio.h>
int main(void)
{ int a = 5, b; b = ++a; /*等价于这两条语句a = a + 1; b b = a;*/ printf("a = %d, b = %d\n", a, b); return 0;}
这个程序的运行结果与上一个会是一样吗?
正确结果如下:
a = 6, b = 6
再来看另一个程序:
#include <stdio.h>
int main(void)
{int x, y;x = y = 1;x++;++y;printf("x = %d, y = %d\n", x, y);return 0;
}
x与y的结果会相等吗?运行结果如下:
x = 2, y = 2
通过以上三个程序可以理解i++与++i:
1、++作为前缀运算符与作为后缀运算符相比,对变量(即运算对象)而言,运算的结果都是一样的,当增1表达式本身的值却是不同的。
2、i++:先使用变量i的当前值作为i++表达式的值,然后再对i进行加1操作。
3、++i:先对变量i进行加1操作,然后将i的值作为表达式i++的值。
4、++(后缀)的优先级高于++(前缀)的优先级。
3.进入正题
当p表示一个指针变量指向数组a[5] = {1,3,5,7,9}的首地址时
- 理解*(p++)
此时先使用变量p的值作为(p++)的结果,然后将 *p 作为表达式 *(p++)的结果,然后再对p进行加1操作。
示例代码:
#include <stdio.h>int main(void)
{int a[5] = {1,3,5,7,9};int *p = a;printf("*p = %d, p = %p\n", *p, p);printf("*(p++) = %d, p = %p, ", *(p++), p);printf("*p = %d\n", *p);return 0;
}
运行结果如下:
*p = 1, p = 000000000064FE00
*(p++) = 1, p = 000000000064FE04, *p = 3
- 理解*p++:
由于++(后缀)的优先级高于 * 的优先级 ,所以表达式 *p++等价于 *(p++)。
示例代码:
#include <stdio.h>int main(void)
{int a[5] = {1,3,5,7,9};int *p = a;printf("*p = %d, p = %p\n", *p, p);printf("*p++ = %d, p = %p, ", *p++, p);printf("*p = %d\n", *p);return 0;
}
运行结果:
*p = 1, p = 000000000064FE00
*(p++) = 1, p = 000000000064FE04, *p = 3
- 理解(* p)++:
此时先使用*p的值作为此表达式的值,然后执行 *p加1操作。
示例代码:
#include <stdio.h>int main(void)
{int a[5] = {1,3,5,7,9};int *p = a;printf("*p = %d, p = %p\n", *p, p);printf("(*p)++ = %d, p = %p, ", (*p)++, p);printf("*p = %d\n", *p);return 0;
}
运行结果:
*p = 1, p = 000000000064FE00
(*p)++ = 1, p = 000000000064FE00, *p = 2
- 理解*(++p):
首先先将p进行加1操作,然后将p作为++p的结果,再进行*p操作。
示例代码:
#include <stdio.h>int main(void)
{int a[5] = {1,3,5,7,9};int *p = a;printf("*p = %d, p = %p\n", *p, p);printf("*(++p) = %d, p = %p, ", *(++p), p);printf("*p = %d\n", *p);return 0;
}
运行结果:
*p = 1, p = 000000000064FE00
*(++p) = 3, p = 000000000064FE04, *p = 3
- 理解*++p:
因为 * 与++(前缀)优先级相同,且自右向左执行,所以表达式*++p等价于*(++p)。
示例代码如下:
#include <stdio.h>int main(void)
{int a[5] = {1,3,5,7,9};int *p = a;printf("*p = %d, p = %p\n", *p, p);printf("*++p = %d, p = %p, ", *++p, p);printf("*p = %d\n", *p);return 0;
}
运行结果:
*p = 1, p = 000000000064FE00
*++p = 3, p = 000000000064FE04, *p = 3
小白一枚,如有错误,还请纠正。
本文标签: 区分C语言中的*(p) *p (*p) *(p)
版权声明:本文标题:区分C语言中的*(p++), *p++, (*p)++, *(++p), *++p 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1687961596h162433.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论