彻底搞定C指针2
姚云飞
1 指针是什么东西
“指针,你真是像雨像云又像雾,想要读懂你真不容易。”其实在我们现实的生活中指针无所不在,我们也处处在使用它。有了它,我们的生活才变得更加方便了,不信?让你瞧瞧!
现实生活中的指针
假如我要还给你一本书,当我到了你的宿舍,发现你不在。于是我把书放在你书架的2层第3个隔架的位置上,并留下一条纸条在你的桌上。纸条上写着:我还你的书在书架的第2层第3个隔架上。当你回来时,看到这张纸条,你就知道我还你的书放在哪了。
现在你想想看,例子中这张纸条的意义。纸条本身并不是书,它上面也没有放着书。可是你是如何知道书的位置呢?不就是因为纸条上写着那本书的位置嘛!在这里,这张纸条其实就是我们现实生活中一个指针了。它上面的内容不是书本身,而是书的地址,你通过纸条这个“指针”找到了我还给你的书了。
C指针与一般变量没什么不同
那么我们C,C++中的指针又是什么呢?看下面看一个申明一整型指针变量的语句如下:
int * pi;
pi是一个指针,我们当然知道的。但你不要以为pi一定是个多么极为特别的东西了,其实,它也只过是一个变量而已。与上一篇中说的变量并没有实质的区别。不信请你看图2-1所示的pi。(注:这里我假设了指针只占2个字节宽度,实际上在32位系统中,指针的宽度是4个字节宽的,即32位。)
内存地址→ 6 7 8 9 10 11 12 13 14
··· | 30 | ‘t’ | | | | | | |...
变量 |→i ←|→a ←| |→ pi ←|
图2-1
由图中可以看出,我们使用int* pi所申明的指针pi其实就是内存某处一定宽度的空间,这个空间被命名为pi。你能在图2-1中看出pi与前面的i、a的变量有什么本质区别吗?显然,没有,没什么本质的区别!pi也不过像i、a等一样的变量而已嘛!可是我们为什么要称之为指针?关键是我们要把这个变量所存储的内容看成是什么。
C指针与纸条
现在我要让pi成为真正有意义上的指针。请接着看下面语句:
pi=&i;
你应该知道 &i是什么意思吧!再次提醒你啦:这是返回i变量的地址编号。整句的意思就是把i地址的编号赋值给pi,也就是你在pi上写上i的地址编号。结果如图2-2所示:
内存地址→ 6 7 8 9 10 11 12 13 14
··· | 30 | ‘t’ | | | 6 | | |...
变量 |→i ←|→a←| |→ pi ←|
图2-2
执行完pi=&i;后,在图2-2所示的情况下,pi的值是6。这个6就是i变量的地址编号,这样pi就指向了变量i了。
你看,pi与那张纸条有什么区别?pi不就像是那张纸条吗?我们在它上面写上i的地址,而i就相当于那个本书了。pi的内容是i变量的地址,换句话说,pi指向i变量,因此我们就把pi称为“指针”了。
接下来,我们就可以通过这个指针pi来访问到i这个变量了,不是吗?看下面语句:
printf(“%d”,*pi);
这个“*pi”什么意思呢?你可以这样读它:返回pi所指地址的内容,也就是pi这张“纸条”上所写的位置上的那本 “书”——i的内容了,也即30。所以这条语句会在屏幕上显示30,也就是说*pi就是i。
到此为止,我们应该知道&i , *pi的含义了。总的说来,我们的纸条就是我们的指针,pi其实也只不过是我们的纸条!剩下的就是我们如何应用这张纸条了的事了。
最后我给你一道题:程序如下。
char a,*pa;
a=10;
pa=&a;
*pa=20;
printf( “%d”, a);
你能直接看出输出的结果是什么吗?如果能,我的目的就达到了。Happy to Study!