对C语言中的指针概念,如果我告知你,它是1个地址变量,你听了1头雾水,“地址?啥意思?”见你不理解,我说的详细点“指针变量跟其他变量1样,存储的是1个地址”。你想了想,“跟其他变量1样?其他变量寄存的是数值,变量有地址....指针变量寄存的是地址,地址里有个值.....”你又晕掉了!没办法,我找了专业教材,找到教材上对指针的定义“指针是1个变量,存储的另外一个变量的地址,也就是另外一个变量所在的内存位置的首地址。”你转了转大眼睛,依然1头懵逼!
好吧,看来传统的解释会让你1直晕下去,那我不解释了,本篇文章我不解释甚么叫指针了,我就重点说下为何指针会让你晕,指出让你晕的根本缘由,或许你知道了就不晕了呢?
我们先来看1个很简单的变量定义:
int a = 1;
a是1个整型变量,它的值是1,对这么简单的1个变量,你铁定地绝对地1定地不会晕,a就是1,1就是a嘛,简单、清晰、明了!
画个图来看下:
好了,下面我们再定义1个指针变量p:
#include "stdio.h"
#include "stdlib.h"
int main()
{
int *p = NULL;
p = (int *) malloc (sizeof(int)); //为指针变量p申请1段内存地址
printf("指针p的值是%x\n", p);
*p = 2;//上述申请的内存地址寄存的数值是2
printf("指针p指向的值是%d\n", *p);
free(p);
p = NULL;
return 0;
}
我们先看下运行结果:
p的值是“380fe0”,指向的值是2。你看到这个后,你会想“刚才变量a和1好理解,a就是1,1就是a。现在有p,380fe0,23个东东,p就是380fe0?那p跟2是啥关系?380fe0跟2又是啥关系?对了,好像还有个*p这个东东,又是甚么关系?完了,我晕了!!”现在我可以指出,在理论上,你指针学多了晕的根本缘由就在以下两点:
1.有4个东西:p,*p,380fe0和2,比刚才的a和1硬生生多了两个东西,使得你大脑思考时多了两个需要思考的对象,增加了你大脑思考的负担;
2.这4个东西:p,*p,380fe0和2中,只有p、*p、2会被程序代码所使用,380fe01般用不到,但是你又必须时时刻刻记着这个380fe0,又再次增加你大脑思考的负担;
好了,我再用1张图来形象地解释你会晕的缘由:
与a和1的那张图对照,形象上来讲你指针学多了晕的根本缘由又在以下3点:
1.你传统思惟是a就是1,1就是a。但在指针变量来看,p就不是2,2也不是p了。p是啥?p就是380fe0,380fe0就是p。注意,你的传统思惟开始第1次被颠覆,接着看:
2.那谁就是2,2就是谁呢?答案就在于*p就是2,2就是*p。出现了*p,你的传统思惟第2次被颠覆,哈哈;
3.那p和*p啥关系?二者长的好像啊,就是多了1个*的区分。你的传统思惟开始第3次被颠覆。到这里,你基本上已晕了;
那末,在学指针,用指针时,如何做到不晕呢?除好好多学习多思考外,我教你3招:
1.看到指针变量时,立即抛弃你的a就是1,1就是a的传统思惟,开始想到p,*p,380fe0和2这4个东东,不然你会思考的很痛苦;
2.牢记p与380fe0是1家,*p与2是1家;
3.记住p与2是远方亲戚,p与2要通过*p来联系;*p与380fe0是远方亲戚,*p脱掉*就和380fe0是1家了。
这篇文章主要是分析指针学习让你头晕的缘由,文字表述可能其实不严谨,请见谅!