回 帖 发 新 帖 刷新版面

主题:C,C++初学者来吧:《我要彻底搞定C指针》第二篇---指针是什么

二.指针是什么东西
指针,想说弄懂你不容易啊!我们许多初学指针的人都要这样的感慨。我常常在思索它,为什么呢?其实生活中处处都有指针。我们也处处在使用它。有了它我们的生活才更加方便了。没有指针,那生活才不方便。不信?你看下面的例子。
这是一个生活中的例子:比如说你要我借给你一本书,我到了你宿舍,但是你人不在宿舍,于是我把书放在你的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:yyf977@163.com。
到此为止,你掌握了类似&i , *pi写法的含义和相关操作吗。总的一句话,我们的纸条就是我们的指针,同样我们的pi也就是我们的纸条!剩下的就是我们如何应用这张纸条了。最后我给你一道题:程序如下。
char  a,*pa
a=10
pa=&a
*pa=20
printf( “%d”, a)
你能直接看出输出的结果是什么吗?如果你能,我想本篇的目的就达到了。好了,就说到这了。Happy to Study!在下篇中我将谈谈“指针的指针”即对int * * ppa;中ppa 的理解。

回复列表 (共16个回复)

11 楼

那你说的是听懂了,可好象到关键的地方(最后一题),我觉得是最难理解的,可不可以再给我说说.谢了

12 楼

*pa=20是修改了a变量的内容
printf( “%d”, a)是输出a此时的值
输出的是20而不是10
就说明这个

13 楼

比谭浩强写的好多了

14 楼

希望楼主都发些这些方面的文章,看了以后对指针又有了更具体的认识,万分感激

15 楼

好帖 
很好帖 
确实好帖 
少见的好帖 
真正好的好帖 
难得一见的好帖 
千年等一回的好帖 
好得不能再好的好帖 
惊天地且泣鬼神的好帖 
让人阅毕击掌三叹的好帖 
让人佩服得五体投地的好帖 
让人奔走相告曰须阅读的好帖 
让斑竹看后决定加精固顶的好帖 
让人看后在各论坛纷纷转贴的好帖 
让人看后连成人网站都没兴趣的好帖 
让人看完后就要往上顶往死里顶的好帖 
让人看后不断在各种场合重复引用的好帖 
让人一见面就问你看过某某好帖没有的好帖 
让人半夜上厕所都要打开电脑再看一遍的好帖 
让个读过后都下载在硬盘里详细研究欣赏的好帖 
让人走路吃饭睡觉干什么事连做梦都梦到它的好帖 
让人翻译成36种不同外语流传国内外世界各地的好帖 
让人纷纷唱道过年过节不送礼要送就送某某帖子的好帖 
让国家领导人命令将该帖刻在纯金版上当国礼送人的好帖 
让网络上纷纷冒出该帖的真人版卡通版搞笑版成人版的好帖 
让人在公共厕所里不再乱涂乱化而是纷纷对它引经据典的好帖 
让某位想成名的少女向媒体说她与该帖作者发生过性关系的好帖 
让人根据它写成小说又被不同导演拍成48个不同版本的电影的好帖 
让某名导演跟据此帖改拍的电影在奥斯卡上一连拿了11个奖项的好帖 
让人大代表们看完后联名要求根据该帖的内容对宪法做适当修改的好帖 
让人为了谁是它的原始作者纷纷地闹上法院打官司要争得它的版权的好帖 
让各大学府纷纷邀请该帖作者去就如何发表优秀网络文学为题目演讲的好帖 
让人为了该帖而成立了各种学会来研究并为不同的理解争得眼红脖子粗的好帖 
让美国警察于今后逮捕人说你有权保持沉默还有权阅读某某帖子要不要啊的好帖 
让本拉登躲在山洞里还命令他手下冒着被美军发现的危险去上网下载来阅读的好帖 
让萨达姆被捕时被发现他随身携带的除了一把手枪之外还有的就是它的复印件的好帖 
让比尔盖茨在懂事会上发给与会者人手一份该帖命令仔细阅读后才讨论其他事宜的好帖 
让诺贝儿奖理事会破天荒地因该帖的出现而开会讨论一直决定今后设立最佳帖子奖的好帖 
让联合国安理会决定将它译成宇宙语由中国神州六号升空后不断播放看有没有外星人的好帖

16 楼

楼主最后得那段农成C++应该是

#include<iostream.h>
void main()
{
int a,*pa;
a=10;
pa=&a;
*pa=20;
cout<<a<<endl;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册