指针,想说弄懂你不容易啊!我们许多初学指针的人都要这样感慨。我常常在思索它,为什么呢?其实生活中处处都有指针,我们也处处在使用它。有了它我们的生活才更加方便了。没有指针,那生活才不方便。不信?你看下面的例子。
这是一个生活中的例子:比如说你要我借给你一本书,我到了你宿舍,但是你人不在宿舍,于是我把书放在你的2层3号的书架上,并写了一张纸条放在你的桌上。纸条上写着:你要的书在第2层3号的书架上。当你回来时,看到这张纸条,你就知道了我借与你的书放在哪了。你想想看,这张纸条的作用,纸条本身不是书,它上面也没有放着书。那么你又如何知道书的位置呢?因为纸条上写着书的位置嘛!其实这张纸条就是一个指针了。它上面的内容不是书本身,而是书的地址,你通过纸条这个指针找到了我借给你的这本书。
那么我们C/C++中的指针又是什么呢?请继续跟我来吧,下面看一条声明一个指向整型变量的指针的语句:
int *pi;
pi是一个指针,当然我们知道啦,但是这样说,你就以为pi一定是个多么特别的东西了。其实,它也只过是一个变量而已。与上一篇中说的变量并没有实质的区别。不信你看下面图:
说明:这里我假设了指针只占2个字节宽度,实际上在32位系统中,指针的宽度是4个字节宽的,即32位。
由图示中可以看出,我们使用“int *pi”声明指针变量—— 其实是在内存的某处声明一个一定宽度的内存空间,并把它命名为pi。你能在图中看出pi与前面的i、a 变量有什么本质区别吗?没有,当然没有!pi也只不过是一个变量而已嘛!那么它又为什么会被称为“指针”?关键是我们要让这个变量所存储的内容是什么。现在我要让pi成为具有真正“指针”意义的变量。请接着看下面语句:
pi = &i;
你应该知道&i是什么意思吧。再次提醒下:这是返回i变量的地址编号。整句的意思就是把i地址的编号赋值给pi,也就是你在pi里面写上i的地址编号。结果如下图所示:
你看,执行完pi=&i后,在图示中的内存中,pi的值是6。这个6就是i变量的地址编号,这样pi就指向了变量i了。你看,pi与那张纸条有什么区别?pi不就是那张纸条嘛!上面写着i的地址,而i就是那个本书。你现在看懂了吗?因此,我们就把pi称为指针。所以你要记住,指针变量所存的内容就是内存的地址编号!好了,现在我们就可以通过这个指针pi来访问到i这个变量了,不是吗?看下面语句:
printf("%d", *pi);
那么*pi什么意思呢?你只要这样读它:pi的内容所指的地址的内容(嘻嘻,看上去好像在绕口令了),就是pi这张“纸条”上所写的位置上的那本 “书”—— i 。你看,Pi的内容是6,也就是说pi指向内存编号为6的地址。*pi嘛,就是它所指地址的内容,即地址编号6上的内容了,当然就是30这个“值”了。所以这条语句会在屏幕上显示30。也就是说printf(“%d”, *pi)等价于printf(“%d”, i) ,请结合上图好好体会吧!各位还有什么疑问?
到此为止,你掌握了类似&i、*pi写法的含义和相关操作吗?总的一句话,我们的纸条就是我们的指针,同样我们的pi也就是我们的纸条!剩下的就是我们如何应用这张纸条了。最后我给你一道题:程序如下:
#include <stdio.h>
int main()
{
int a, *p;
a = 10;
p = &a;
*p = 20;
printf("%d", a);
return 0;
}
你能直接看出输出的结果是什么吗?如果你能,我想本篇的目的就达到了。好了,就说到这了。
下面是答案:
20
Process returned 2 (0x2) execution time : 0.089 s
Press any key to continue.