2 回答
TA贡献50条经验 获得超11个赞
p是地址 *p的*是取出p地址中存放的值的符号刚开始把 数组a的数组名(数组名a是一个地址常量)赋给变量p(这里的p是存放地址的变量) p++就是让p里面的地址变成下一个元素的地址,其他运算符 +、-之类的都同理,试一下就知道了
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。 这样的语句的行为是不确定的。
- 2 回答
- 1 关注
- 1585 浏览
添加回答
举报