发布网友 发布时间:2024-02-10 13:21
共1个回答
热心网友 时间:2024-03-02 04:50
因为你没有说明p与n的类型,我暂且假定它们初始化如下:
int m = 0;现在来说明这几个分不清的含义:
(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没有变化。