c指针的理解 (一) * & (int *)

几行代码了解c指针:

敲击如下代码:

#include <stdio.h>
int main(){
	int p=5;
	printf("%d\n",p);
	printf("%x\n",*(&p));
	printf("%x\n",&p);
	//int *q= 0x62fe44;
	//printf("%d",*q);
	return 1;
}

然后在IDE中打开调试:

我这里选择的IDE是 dev c++


点击添加查看,将p,*p,&p,*(&p) ,q,*q,&q,*(&q)这几个变量添加进去(当然q的也可以之后加)

然后加断点,开始调试


如图所示:

p=5,即p的类型是int型,

但是*p在处理的时候,却把p的类型自动转换为了指针类型,即0x5。

再看下一个&p处理的时候,值是指针类型,也就是0x62fe4c。这个指针地址也就是int p=5存放的地址。

再看下一个变量*(&p)的值是5,等于p,其实也就是p。

由此可以看出

*p    中 p是指针,0x类型。    *p是这个指针所指向的内存地址所存放的值的类型   本题中因为0x5,这个地址不可读。所以,没有数据。

&p   整体是一个指针  0x类型    但p的类型是这个整体所代表的指针的地址所存放的值的类型,比如此例中的int类型

*(&p) 这个变量其实就是p。相当于绕了一圈又转回来了。

0x62fe4c ->  5
0x5 -> not read

也就是上述模型  p=5,*p=not read,&p=0x62fe4c,*(&p)=5。

然后把注释去掉,把地址换成p的地址,添加变量,重新调试。



接着分析:

我们将q这个变量声明为了(int *),也就是说 q的类型是个指针,0x类型。

那么  *q就是取这个内存地址的值,因为编译时有改动,我们将q的值重新设置一下。


这回刚好,指针q正好指向p的地址。,于是内存模型就变成了

0x62fe48 -> 0x62fe44
0x62fe44 ->  5
0x5 -> not read

&q就是个指针的指针,也就是说指针0x62fe48这个指针处存放的数据还是个指针(指向一个int 类型的指针),

因为q就是指针类型,所以*q就取到了存放在q这个指针地址处的值,也即是5这个int。

这个时候如果我把 int *q 改成 char *q,会出现什么情况呢?如下图:


*q 依然是没有问题,但在处理的时候,5就不在是int,而是被当成了字符来处理也就是上图中的‘\005’。

出现解析类型错误。

至此,int *,*,&应该就明白了。





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值