| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 575 人关注过本帖
标题:指针问 地址差
只看楼主 加入收藏
孤独一生
Rank: 2
来 自:四川达县
等 级:论坛游民
帖 子:45
专家分:55
注 册:2013-4-1
结帖率:56.25%
收藏
已结贴  问题点数:20 回复次数:9 
指针问 地址差
int i=0;
int j=1;
int *p1=&i;
int *p2=&j;
*p1=p1-p2;这里看不懂地址差  需要详细
printf("%d",*p1);地址差是等于1  怎么算的
本人自学

[ 本帖最后由 孤独一生 于 2014-7-1 18:08 编辑 ]
2014-07-01 07:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
从第3行开始连续三行都是错误代码

授人以渔,不授人以鱼。
2014-07-01 08:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
所问的那一行代码,不知道是你自己写的还是看来的,纵然语法没有错误,也是毫无意义的代码。

授人以渔,不授人以鱼。
2014-07-01 08:08
周满悦
Rank: 3Rank: 3
来 自:江苏
等 级:论坛游侠
威 望:2
帖 子:42
专家分:131
注 册:2014-6-21
收藏
得分:5 
朋友指针就是指向一个变量的地址, 你看下面的列子

int i = 10, j;
j = i;

i和j都是变量,是同一类型,所以可以相互赋值;

int *p1, *p2;

p1 = &i;
p2 = &j;

指针变量可以指向一个变量的地址, i的地址与j的地址说白了就是一个很大的整数,用来记录i,j所存放的地方,而指针变量你可以把它看成“地址变量”,所以可以把地址的值赋值过来;

那么至于指针变量值的加与减,请看下面列子

p1 = p1 - p2; (如果 p1 = 0x3484, p2 = 0x3480)
那么 p1 = p1 - p2; (也就是4)
这个值是豪无用处的, 所以这种做法是不可取的;
指针的增减  一般是用来“移位”

如 ++p1; 就是指向与下一个地址
   --p1;就是指向上一个地址

我只是一个自学的。
2014-07-01 08:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 4 楼 周满悦
不要以为指针的值是整数,根本是两回事。

授人以渔,不授人以鱼。
2014-07-01 08:20
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
收藏
得分:5 
图片附件: 游客没有浏览图片的权限,请 登录注册

就像版主说的,你的代码写的就有问题,你看看p2(001DFCDC)是间隔了12个字节到p1(001DFCE8)的,整型变量在内存中占4个字节,所以指针p2偏移3就到了指针p1所指的地址。你最后的输出语句也有问题,p1中是i的首字节地址,要么用%p输出p1,要么用%d输出*p1,
2014-07-01 09:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 6 楼 chrisgardner
你的这个测试不严谨,从而得到的某些结论也不对。你在i、j之间再声明几个不同的变量试试,最好各种类型都有,自然知道这种求地址差的做法为什么毫无意义。

授人以渔,不授人以鱼。
2014-07-01 09:22
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
收藏
得分:0 
回复 7 楼 TonyDeng
我按照你说的试了一下:
图片附件: 游客没有浏览图片的权限,请 登录注册

1.插入了字符和浮点变量的声明语句,内存给它们分配了空间,可计算机是不是就认为从p2偏移9个单元(36个字节)就能到p1那里?尽管这么做没什么意义。
2.在内存连续存储同类型数据的情况下,比如数组,那么地址差就合理了呢?
希望版主指教一下啊,呵呵
2014-07-01 13:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
给变量安排空间,可以说是随机的,这个随机是指声明变量的顺序、依次每个变量的尺寸、运行时栈因进退或递归函数导致每次分配不同等而不同,所以对两个没有逻辑关联的变量地址求差是没有任何意义的。比如你这个测试示例,地址距离是36个字节,但这36个字节之间并非都是以4字节为单元(指针声明的单元尺寸是int型即4字节)的数据,对i、j这样两个没有丝毫逻辑关系的变量,这36个字节之间的距离毫无意义,计算机也不依靠这个偏移量来寻址,决不会从i移动36个字节来找到j(它是从栈的边界开始用分配时的偏移量来寻址)。

当两个地址有逻辑关联时,计算偏移量才有意义。比如对一块连续内存,对头尾两个边界地址求差,就可以得到这块内存的尺寸,又假如这块内存所储存的都是相同类型的数据,即每个元素的尺寸都一样,那么这个差值也能表示元素的个数。若这里的i和j分别是这样的两个变量数据,这种计算就有意义了。


[ 本帖最后由 TonyDeng 于 2014-7-2 10:42 编辑 ]

授人以渔,不授人以鱼。
2014-07-01 16:59
chrisgardner
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:73
专家分:114
注 册:2013-9-25
收藏
得分:0 
回复 9 楼 TonyDeng
谢谢版主的讲解,虽然还是不太懂栈的相关知识,但是明白了地址差在什么时候有意义什么时候没有意义。
2014-07-02 09:05
快速回复:指针问 地址差
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017944 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved