先要理解地址和数据,可以想象有很多盒子,每个盒子有对应的号码,那个号码叫做“地址”,而盒子里放的东西叫做“数据”。上面就段理解了,*p和p的区别就不难解释了。p是指针变量,用来存放地址,可以认为是上面所说的盒子的号码,“*”是解引用操作符,可以把它理解成打开盒子,*p就是打开p号盒子,取出里面的数据。简单来说,p存放的是地址,而*p是让程序去那个地址取出数据。
首先你要明白再C语言中*的优先级低于++的,所以对于*++p来说是先将指针p向后移动一位后再取出p所指地址里面的内容而++*p是先取出p所指地址里面的内容,然后再将取出的这个值自加1.
如a=*(++P)表示P先自增,指向下一个地址 ,再取值相当于a=*(P+1) ;p=p+1
a=*(P++) 表示先取P的值 P再指向下一个地址 相当于a=*p;p++
++P先自增
p++先取值
如果没赋值给上面的a或输出的话,效果是一样的
若p和q是申明为类型兼容的指针变量,且都正确赋有合法值且不为NULL,那么,*p=*q是把指针q指向的目标值赋给指针p指向的目标;p=q则是使指针p指向指针q指向的目标(最终是p和q指向了同一目标,这个目标就是q指向的目标)。在q==NULL时,*p=*q非法操作,p=q是合法操作(使p和q同为NULL)。综上,除q为无效(NULL)时不能取值操作外,正常情况下*p=*q操作的是指针指向的目标,p=q操作的是指针本身——这是二者的本质区别。以下代码可以验证:
#include "stdio.h"
int main(int argc,char *argv[]){
int *p,*q,a=334,b;
q=&a;
p=&b;
*p=*q;
printf("b = %d, a = %d
",*p,*q);//b获得了a的值
p=q,b=123;
printf("*p = %d, *q = %d, b = %d
",*p,*q,b);//p,q都指向了a,b值未变
q=NULL;
p=q;//NULL指针作右值是合法的
printf("p = %p, q = %p
",p,q);
printf("%d
",*p);//取NULL指针的值*p是非法的
return 0;
}
验证结果如下:
本站内容仅供参考,不作为诊断及医疗依据,如有医疗需求,请务必前往正规医院就诊
祝由网所有文章及资料均为作者提供或网友推荐收集整理而来,仅供爱好者学习和研究使用,版权归原作者所有。
如本站内容有侵犯您的合法权益,请和我们取得联系,我们将立即改正或删除。
Copyright © 2022-2023 祝由师网 版权所有