求大神解下关于c语言的题目

我成功被*p++,*(p++),*(++p),*(p+2),*++p给弄糊涂了。

问题一:*p代表地址,*(p+2)中的p代表常量吗?

问题二,搞不懂下面代码。

能都详细讲下吗?谢谢兄弟了。

#include<stdio.h>

main()

{

int k,a[]={1,3,5,7,9},*p=a;

printf("%d,%d,%d\n",*p,*(p++),*(p+2));

printf("%d,%d,%d\n",*p,*p++,*++p);

p=a;

printf("%d,%d\n",(*p)++,*(p++));

for (k=0;k<5;k++)

printf("%d",a[k]);

printf("\n");

}


这不是个bug
浏览 1586回答 2
2回答

汉江怪人

p是地址 *p的*是取出p地址中存放的值的符号刚开始把 数组a的数组名(数组名a是一个地址常量)赋给变量p(这里的p是存放地址的变量) p++就是让p里面的地址变成下一个元素的地址,其他运算符 +、-之类的都同理,试一下就知道了 

onemoo

在定义变量时,变量名前面的*号代表这个变量是指针:int *p=a  这样p是一个指向int的指针,并且被初始化为指向a数组的第一个元素。在使用指针时,变量名前面的*号代表“解引用”这个指针,也就是得到指针所指的对象。我先单独解释下 *p  *(p++)  *(p+2)  *p++  *++p 这几个表达式的行为:*p: 就是得到p所指的对象,也就是a中的第一个元素。*(p++): p++得到的还是p,所以解引用(*)后还是得到p指向的对象,但是p++还会使p自增1,所以之后p就指向之前位置的后一个元素了。*(p+2): 先p+2,即得到指向p(p指向a的第二个元素)后面第二个位置元素的指针(不是p,这一步也不会改变p的指向),再解引用(*)得到p所指位置后面第二个元素。*p++: 后置++运算符的优先级要高于*,所以本表达式和*(p++)一样。*++p: 前置++运算符的优先级也高于*,且离得更近,所以会先运算 ++p, ++p表达式得到的就是指向p后面一位的指针。再解引用(*)这个指针得到原p所指的后面一位的元素。并且之后p也会自增1,p同样也指向原来p位置之后的那个元素。注: ++p 和 p++ 的行为是不同的,上面用下划线标出了区别。下面是另一个重点:这几个printf语句都不该这样写!一个大概的规则是:如果自增或自减运算符应用到一个变量上,那就不要在同一个表达式(或许是语句)中再次使用这个变量!  (这句不是很准确,因为原因比较复杂,你可以先这样记)那么这几个pritnf语句的毛病就是:这个语句中使用了p++或++p,同时又再次多次使用了p。 这样的语句的行为是不确定的。
打开App,查看更多内容
随时随地看视频慕课网APP