比如说你要 我借给你一本书,我到了你宿舍,但是你人不在宿舍,于是我把书放在你的2层3号的书架上,并写了一 张纸条放在你的桌上。纸条上写着:你要的书在第2层3号的书架上。当你回来时,看到这张纸条。你就 知道了我借与你的书放在哪了。你想想看,这张纸条的作用,纸条本身不是书,它上面也没有放着书。 那么你又如何知道书的位置呢?因为纸条上写着书的位置嘛!其实这张纸条就是一个指针了。它上面的 内容不是书本身,而是书的地址,你通过纸条这个指针找到了我借给你的本书。
那么我们C,C++ 中的指针又是什么呢?请继续跟我来吧,看下面看一个申明一整型指针变量的语句如下:
int * pi;
pi是一个指针,当然我们知道啦,但是这样说,你就以为pi一定是个多么特别的东西了。其 实,它也只过是一个变量而已。与上一篇中说的变量并没有实质的区别。不信你看下面图。
内存 地址→6 7 8 9 10 11 12 13 14
--------------------------------------------------------------
...| 30 | ‘t’ | | | | | | |……
--------------------------------------------------- -----------
变量 |→i ←|→a ←| |→ pi ←|
(说明:这里我假设了指针只占2个字节宽度,实际上在32位系统中,指针的宽度 是4个字节宽的,即32位。)由图示中可以看出,我们使用int *Pi申明指针变量; 其实是在内存的某处 申明一个一定宽度的内存空间,并把它命名为Pi.你能在图中看出pi与前面的i,a 变量有什么本质区别 吗,没有,当然没有!pi也只不过是一个变量而已嘛!那么它又为什么会被称为指针?关键是我们要让 这个变量所存储的内容是什么。现在我要让pi成为真正有意义上的指针。请接着看下面语句:
pi=&i;
你应该知道 &i是什么意思吧!再次提醒你啦:这是返回i变量的地址编 号。整句的意思就是把i地址的编号赋值给pi,也就是你在pi上写上i的地址编号。结果如下图所示:
内存地址→6 7 8 9 10 11 12 13 14
------------------------------------------------------------------
...| 30 | ‘t’ | | | 6 | | |……
----------------------------------------------- -------------------
变量 |→i ←|→a ←| |→ pi ←|
你看,执行完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 ) ,请结合上图好好体会吧!各位还有什么疑问,可以发Email:
[email protected].
到此为止,你掌握了类似&i , *pi写法的含义和相关操作吗。总的一句话 ,我们的纸条就是我们的指针,同样我们的pi也就是我们的纸条!剩下的就是我们如何应用这张纸条了 。
追问你好,你讲解的很透彻,让我一下子明白了很多,但是我看到书上的这个内容,似乎觉得第一个内容是正确的,第二条是错误的,请问第二条上的内容怎么解释?谢谢!
![](https://video.ask-data.xyz/img.php?b=https://iknow-pic.cdn.bcebos.com/a9d3fd1f4134970ac055e6b597cad1c8a7865d02?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto)
本回答被提问者采纳