为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C C++
这不是个bug 2015-12-15 20:34:04
我成功被*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");}
查看完整描述

2 回答

?
汉江怪人

TA贡献50条经验 获得超11个赞

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

查看完整回答
1 反对 回复 2015-12-16
?
onemoo

TA贡献883条经验 获得超454个赞

在定义变量时,变量名前面的*号代表这个变量是指针:

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。 这样的语句的行为是不确定的。

查看完整回答
反对 回复 2015-12-16
  • 2 回答
  • 1 关注
  • 1530 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信