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

几行代码了解c指针:

敲击如下代码:

#include 
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的也可以之后加)

然后加断点,开始调试

c指针的理解 (一) * & (int *)_第1张图片

如图所示:

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的地址,添加变量,重新调试。

c指针的理解 (一) * & (int *)_第2张图片


接着分析:

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

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

c指针的理解 (一) * & (int *)_第3张图片

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

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

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

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

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

c指针的理解 (一) * & (int *)_第4张图片

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

出现解析类型错误。

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





你可能感兴趣的:(c语言)