从四个属性的角度来理解C语言的指针也许会更好理解

关于指针是什么,很多教材已经作出了定义,大多数都会定义为“存放变量内存地址的变量”。从这句话中我觉得除了让我知道这个定义有11个字以外,其他就没什么用了。我个人觉得要理解指针,不是光光说一下是变量的地址就万事大吉了,而是要从多个属性来解释指针,为此,我个人总结了一个所谓的多维属性法来理解指针。

另外,为了能把指针说清楚,我认为关键不在于用苦涩的文字描述,而在于以示意图的形式描述清楚指针的概念。我接下来就准备用我的多维属性法,加上画几张图,和一些伪代码,尽量说清楚指针是什么。绘图水平有限,技术水平也有限,欢迎多批评。

1.要说清楚指针是什么之前,先来看看如何从多维属性来理解普通变量,以及普通变量在内存中是什么样儿的。

比如现在有个整型变量:int a = 1;也就是说整型变量a的值是1,在内存中的存放如示意图1所示:

从四个属性的角度来理解C语言的指针也许会更好理解

相信朋友们对这张图无任何异议,很简单嘛,a就是1,1就是a嘛。好了,我可以提炼出变量a的三个属性出来,分别是有用数据的名字,有用数据的值,有用数据的类型。

有用数据的名字,就是“a”;

有用数据的值,就是“1”;

有用数据的类型,就是“int”;

我之所以用“有用数据”这四个字来描述,是因为程序代码中会经常用到变量“a”,以及它的值“1”,还有它的类型“int”,那不就是有用的嘛,所以我就“有用数据”来描述变量a的三个属性。好了,我用下面的表示法来表示变量a的这三个属性:

变量a=(有用数据的名字,有用数据的值,有用数据的类型)

好了,假设变量a的地址是“0x380fe0”,则示意图2是从变量a的地址的角度来看变量a在内存中的存放形式:

从四个属性的角度来理解C语言的指针也许会更好理解

在图2中,我标记出变量a的地址是16进制的0x380fe0,a为1,也就是在内存地址为“0x380fe0”的地方放了一个值1。用C语言表示地址的术语来说就是“&a”等于“380fe0”。“&”是表示变量地址的意思。这张图相信朋友们也没有什么异议,对吧,都是很直观的东西。好,我又可以提炼出变量a的第4个属性,叫做“有用数据的地址”,也就是“&a”啦。至此,变量a的四个属性都齐全啦,如下:

变量a=(有用数据的地址,有用数据的名字,有用数据的值,有用数据的类型),具体到本例,就是:

变量a=(0x380fe0,a,1,int)

从四个属性来说明一般的整型变量在内存中的样儿,好了,下面我要放大招儿了,再说说从四个属性来理解指针变量,以及指针变量在内存中的样儿。

我定义一个指针变量:

int *p = NULL;

p = 0x380fe0;

这两句代码朋友们也一定看的懂的,就是一个指针变量p的值用16进制来表示就是“0x380fe0”,这正好是变量a的地址。p在内存中的表示如下示意图3:

从四个属性的角度来理解C语言的指针也许会更好理解

示意图3

示意图3跟整型变量a的示意图1没任何区别,我也可以说p就是0x380fe0,0x380fe0就是p,跟变量a就是1,1就是a是一个道理。好,这里我提炼出指针p的第一个属性,叫做“指针自己的值”,指针变量p的值是0x380fe0,可不就是自己的值嘛!用如下表示发来表示就是:

指针p=(指针自己的值)

到此为止,朋友们应该都是无异议的,好,下面再来看“*p”是什么东西,如下示意图4所示:

从四个属性的角度来理解C语言的指针也许会更好理解

示意图4

指针变量p前面加个“”就变成了“p”。很多教材会说“指针变量p指向的值是1”,这说了等于没说,谁看的懂。加了星号后,p就是a的等价物了,是a的别名了,也就是p就是a,a就是*p。这样说大家应该都会看懂吧。好了,这里我可以提炼出指针变量p的剩余三个属性了,分别叫做”与星号结合名“,”有用数据的值“,”有用数据的类型“。

与星号结合名:就是”“与指针p结合,变成p;

有用数据的值:就是1;跟变量a的第三个属性一样;

有用数据的类型,就是int;跟变量a的第四个属性一样。

这样指针变量p的四个属性也齐全了,如下:

指针变量p=(指针自己的值,与星号结合名,有用数据的值,有用数据的类型)。在本例就是:

指针变量p=(0x380fe0,*p,1,int)。

3. 用变量a的四个属性与指针变量p的四个属性对比,一下子就能看出指针的本质了。

我整理下上述的伪代码:

int a = 1;//假设变量a的地址是0x380fe0

int *p = NULL;

p = &a;

再用我说的多维属性法分别来表示整型变量a和指针变量p,分别如下:

整型变量a=(有用数据的地址,有用数据的名字,有用数据的值,有用数据的类型)

指针变量p=(指针自己的值,与星号结合名,有用数据的值,有用数据的类型)

在本例中,它们各自的属性就是:

整型变量a=(&a的值,a,1,int)

指针变量p=(p的值,*p,1,int)

再细一点,就是:

整型变量a=(0x380fe0,a,1,int)

指针变量p=(0x380fe0,*p,1,int)

看出来了吗?看出来了吗》看出来了吗?它们的四个属性的含义是一一等价的,具体来说就是:

”&a“ 就是 ”p“.

”a“就是 ”*p“

”1“ 就是 ”1“

”int“ 就是 ”int“

这才是理解指针p的本质关键所在。

关于”&a“ 就是 ”p“我再说两句。同样是表示地址,”&a“是用了”&“和”a“两个字符的组合来表示的,而”p“就用了一个字符”p"来表示,这种字符数量上的不一致导致了很多人学指针时会犯晕!

关于”a“就是 ”p“我也说两句。同样是表示整型变量的名字,这次”a“就用了一个字符”a“来表示,而”p“用了字符“*”和”p"两个字符来表示,又是这种字符数量上的不一致又导致了很多人学指针时会犯晕!

说了这么多废话,其实就是为了说明指针变量的四个属性表示法,建议记住这四个属性表示法,以及与一般整型变量、字符变量等一般变量类型的四个属性之间的等价关系。当然了,别指望记住这四个属性你就理解指针了,该学习的还是要学习,该多写代码的还是要多写代码,我只是希望你记住四个属性后再学习指针时,不至于被指针碾压的那么惨。

对于第二个属性,在本文中,就是一个“”和“p”的结合“p”,别看它是由两个字符组成的,其实本质上就是变量“a”,因此从这一个属性开始,你完全可以用一般的整型变量“a”来思考问题了,也就是直接将“*p”看做“a”,后面的第3个属性就是这个“a”的值“1”,第4个属性就是“a”的类型“int”。记住,从第2个属性开始,就与指针p没有任何关联了,你全部使用整型变量a的思维去思考问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容