几行代码了解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 *,*,&应该就明白了。