请一些c语言指针方面的概念,*p=&n, p=n, *p=n, p++,*p++ *(p+1) 等傻傻分不清,哪位大神给缕缕思路

 我来答
屯祭a
2015-09-19 · TA获得超过840个赞
知道小有建树答主
回答量:215
采纳率:0%
帮助的人:90.6万
展开全部

因为你没有说明p与n的类型,我暂且假定它们初始化如下:

int m = 0;
int *p = &m;    //p指向变量m
int n = 20;

现在来说明这几个分不清的含义:

(1)*p = &n;   &n是取变量n的地址,然后赋值给指针p所指向的内存空间。因为&n是一个地址类型(可看作int指针类型),而*p即为取变量m的值为int类型,等号左右两边类型不匹配,C语言默认强制类型转换,会将地址类型(类似0x7ff97)转换为int类型(如0x7ff97会转换为十进制下的8883503)。注意:因为p指向变量m,所以此句执行后,m的值被更改为8883503.

(2)p=n;   因为n的值为20(十进制,转换为十六进制为0x14),等号左边的P是指针类型,右边是int类型,也会进行默认强制类型转换,执行此句后,p的值变成了0x14,可以用语句 printf("p=%p\n", p)或printf("p=0x%x\n",p)来显示p的内容。

(3)*p=n;  此句假设上面1-2两句没有执行,因为如果执行了(2)后,p的内容是0x14,这是一个普通程序不能操作的内存地址,再执行*p=n意思是将n的值“复制”到0x14这块内存里,这将会是非法操作。  当p还是指向变量m时,执行此句后,n的值就“复制”到m中,m也为20了。

(4) p++ 这和++p效率一样,也和p=p+1效率一样,意思是p的值会增加一个所指向类型的长度,示例中因p指向int类型(4字节长),所以假设p的值原本为0x7ff90,p++后p的值就为0x7ff94

(5)*p++, 一般会这样写 int x=*p++;  因为p指向m(最上面假设),而*比++优先级高,所以这句相当于 两句: x=*p; p++; 故m的值“拷贝”给x了,而p自身增加了4个字节,不再指向m变量。此语句p发生了变化

(6)*(p+1),这句相当于先将p+1,假设p原本为0x7ff90,+1个int类型长度后其值变为了0x7ff94,而前面的*号则意味着取这个0x7ff94地址中的值。此语句p没有变化。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式