C 指针 一
最近有同学问我C中指针的问题,自己也是没解释好吧,语言措辞简直稀烂,毕竟语文不及格…我觉得指针这一块用例题加图来解释,或许更容易理解。文中有什么错误不当的地方,欢迎指正
指针的本质:一个有类型的地址。
首先直接上一段C语言学习指针都会学习的一段程序。
#include <stdio.h>
int main()
{ //为了说明每一步的操作,分开写
int *p;
int a;
a=100;
printf("a=%d\n",a);
p=&a;
printf("p=%p\n",p);//%p 打印地址的格式
printf("&a=%p\n",&a);
*p=200;//此时*p相当于a
printf("a=%d\n",a);
printf("*p=%d\n",*p);
return 0;
}
输出结果:
具体分析过程如下:
①初始状态,没有定义任何变量
②定义了变量p(可看做int *类型),分配内存空间(先不管分配的内存空间是多大)
③定义了变量a,分配内存空间(此时两个内存中的值是随机的,没有意义,写出来没必要)
④将a赋值为100,对应内存中存储的值为100,所以此时能打印出a的值为100。
⑤此时,指针p指向了a,保存了a的地址(注意:是保存了a的首地址!后面的文章中会写到),图中用一种指向关系来表示。所以此时能打印出p的值为变量a的首地址。
⑥注意:*p=200,操作指针所指向的内存!从⑤中可以看到,指针p所指向的内存是哪个?没错就是箭头指向的那块内存,所以此内存中的值由原来的100,变成了200.此时打印a的值,自然是200,打印*p的值,不是打印p的值,而是打印p所指向的内存的值,此时为200.
注意:
①你操作p不会影响a,操作a不会影响p,但是你操作*p就不一样了。当你操作*p时,会先找到p,p里面存放的是&a(a的首地址),即指向了a对应的内存,然后对该内存进行操作,赋值为200。
②有人一直分不清*号,指针中的*号有两层含义:
1、定义变量时,*代表类型,即指针类型
例如:int *p=&a;
2、使用变量时,代表操作指针所指向的内存
例如:*p=200;