[转帖]不同角度理解C语言的指针_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
2
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3509 | 回复: 1   主题: [转帖]不同角度理解C语言的指针        上一篇   下一篇 
    本主题由 Administrator 于 2017-8-30 11:26:44 移动
yan.zhao
注册用户
等级:下士
经验:199
发帖:5
精华:0
注册:1970-1-1
状态:离线
发送短消息息给yan.zhao 加好友    发送短消息息给yan.zhao 发消息
发表于: IP:您无权察看 2017-8-24 17:50:31 | [全部帖] [楼主帖] 楼主

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


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


blob.png

示意图1


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

有用数据的名字,就是“a”;
有用数据的值,就是“1”;
有用数据的类型,就是“int”;

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

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

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


blob.png

示意图2


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

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


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


blob.png

示意图3


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

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

blob.png

示意图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"两个字符来表示,又是这种字符数量上的不一致又导致了很多人学指针时会犯晕!


转自石家的鱼博客


该贴由system转至本版2017-8-30 11:26:43


该贴被huang.wang编辑于2017-9-26 14:18:52



赞(0)    操作        顶端 
huang.wang
注册用户
等级:中将
经验:17623
发帖:407
精华:1
注册:1970-1-1
状态:离线
发送短消息息给huang.wang 加好友    发送短消息息给huang.wang 发消息
发表于: IP:您无权察看 2017-9-26 14:20:17 | [全部帖] [楼主帖] 2  楼

修改了示图,增加了转载出处。

微信的文章不能直接复制粘贴过来,会导致图片失效不能使用。

最简单的可以直接截图粘贴过来


我超级酷,但是如果你回复我的话我可以不酷那么一小会儿。


——来自logo.png


赞(0)    操作        顶端 
总帖数
2
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论