首先,指针是啥?指针变量是什么鬼?
关于指针,这里要先说说计算机内存部分,有点计算机基础的人都知道,计算机内存是有地址的,如果你不知道,好好百度一下内存地址。指针就是内存地址!!!
关于指针变量,是一块用于存储内存地址的特殊变量,说到底,它就是变量!!这个变量只能存指针,即内存地址,可以是别人的内存地址,也可以是自己的内存地址。这说明,它占用了一块空间!
那么,来上机更深一步理解指针和变量吧!
在这里,有两个符号要说明一下,*号理解为取地址中的内容(值);&取该块内存的地址
#include <stdio.h>
main()
{
int *p;
int a=4;
p=&a;
printf("p=%d,a=%d\n",p,a);
printf("*p=%d\n",*p);
printf("&p=%d,&a=%d\n",&p,&a);
printf("*&p=%d\n",*&p);
printf("**&p=%d\n",**&p);
}
这里请大家先自己计算得出结果再往下看。
第一句话,int *p;这句话的意思是,开辟了一块内存空间(记住,内存都是有地址的),p就是指针变量。由于是int型,该内存空间的大小为4byte,该块内存有地址,但内存中什么也没有。假设其内存地址为1703740,用图在计算机内存中表示如下
第二句话,Int a=4;开辟了一块新内存,这里假设地址为1703736,该块内存中有东西了,为4;值得一提的是,a和p两个变量占用的是同样大小的内存,4个byte.如下图
第三句话,p=&a;取出内存块a的地址,即1703736,赋值给内存块p。此时,p中便有了内容,即p=1703736,如下图。
第四句话,printf(“p=%d,a=%d\n”,p,a);输出内存块p和内存块a中的内容(值),由上图,很明显知道,p=1703736,a=4
第五句话,printf("*p=%d\n",*p);这里要明白 * 的真正意思,取地址的内容(值)。故p的内容代表的必定是一个地址,否则会报错。这里我们由第四句话知p=1703736,是为a的地址。故这里 *p相当于 *(1703736),即取地址1703736中的内容(值),由图三看,不就是4嘛!
第六句话,printf("&p=%d,&a=%d\n",&p,&a);&代表的是取变量的地址。p变量的地址为1703740,a变量的地址为1703736
第七句话,printf(" * &p=%d\n",*&p)
&p,取得变量p的地址,不就是1703740嘛
那 *&p 就相当于 *(1703740),看看图三,该地址的内容,就是1703736。
第八句话,printf(" * * &p=%d\n",**&p)
&p,取变量p的地址,还是1703740嘛!
那么此时 **&p相当于 **(1703740)
再来,*(1703740),取地址的内容(值),看看图三,哎,不就是1703736嘛!
此时 **(1703740)相当于 *(1703736),取地址的内容(值),看看图三,就是4咯。
总结,可能文字表述还不太清除,大家多看看我的图片,尤其是图三。希望大家都能理解。
第一次发表文章,如有错误还请大家多多指教!谢谢