中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
c指针问题?
作者:未知 时间:2005-09-13 19:27 出处:ChinaUnix.net 责编:chinaitpower
              摘要:c指针问题?

有下面一程序:
main()
{
  short *p, *q;
  short ar[10]={0};
  p = q = ar;  
  p++;
  printf("%5d", p-q);
  printf("%5d", (char*)p - (char*)q);
}
  假设sizeof(short)==2
它的运行结果为:
1      2
请问这是为什么?

 win_hate 回复于:2004-01-06 22:28:52
p - q 表示 p, q 间相隔了多少个 p, q 所指向的对象。 

p, q 指的是 short,p, q 间相隔一个 short(2 byte) 所以是 1

(char *p), (char *q) 所指的是 char, 他们之间相隔 2 个字节,所以是 2

 yangjian73 回复于:2004-01-06 23:01:04
不太明白,(char *)p和(char *)q 它们之间相差也是一个对象,也应该为
1?

 win_hate 回复于:2004-01-06 23:17:48
[quote:2c449d085e="yangjian73"]不太明白,(char *)p和(char *)q 它们之间相差也是一个对象,也应该为
1?[/quote:2c449d085e]

(char *p) 指向的对象为字节,由于一个 short  为两个字节,所以。。。

但 p 指向的对象为 short, 所以 p-q 为 1

 EndUser 回复于:2004-01-06 23:44:44
[quote:481dc04a4a="win_hate"]p - q 表示 p, q 间相隔了多少个 p, q 所指向的对象。 

p, q 指的是 short,p, q 间相隔一个 short(2 byte) 所以是 1

(char *p), (char *q) 所指的是 char, 他们之间相隔 2 个字节,所以是 2[/quote:481dc04a4a]

补充

(type*)var      var+1    那么地址的增加包含的字节个数为 sizeof(type)

short *p     p++    地址加1     跨越的字节数为2byte

char* p     p++     地址加1     跨越的字节数为1byte


              (char*)p - (char*)q     结果是p和q之间的byte差

 win_hate 回复于:2004-01-07 00:04:04
[quote:44660a52c8="EndUser"]

补充

(type*)var      var+1    那么地址的增加包含的字节个数为 sizeof(type)

     ..........[/quote:44660a52c8]

应为 (type *)var + 1   那么地址的增加包含的字节个数为 sizeof(type)

EndUser 的解释比我的清楚多了。 :D ,

 win_hate 回复于:2004-01-07 00:12:59
哈,我想出了一个更清晰的表达,如果:

type *p, *q; 且 p, q 的值为 P, Q,则

p-q 为 (P-Q)/sizeof (type)


大家想一想下面代码的运行结果? 

[code:1:b6b419c0e1]
#include <stdio.h>

int
main (void)
{
char buf[8];
int *a, *b;

a = (int *)buf;
b = (int *) (buf + 2);
printf ("%d\n", b - a);

a = (int *) buf ;
b = (int *) (buf + 5);

printf ("%d %d\n", b-a, a-b);

exit (0);
}
[/code:1:b6b419c0e1]


不要作弊哦, a-b 的情况看上去有点令人费解,一个合理的解释为:令 p-q 为 x,则 x为使 q + x 指向的对象与 q 指向的对象产生重叠的最小值。

猫头鹰也困了,bye-bye

 flw 回复于:2004-01-07 08:58:01
呵呵,不错。已收入 [color=red:8c20be8b8f]FAQ-6-3[/color:8c20be8b8f]

 yangjian73 回复于:2004-01-07 09:15:19
[quote:bb175c04c7="EndUser"]

补充

(type*)var      var+1    那么地址的增加包含的字节个数为 sizeof(type)

short *p     p++    地址加1     跨越的字节数为2byte

char* p     p++     地址加1     跨越的字节数为1byte


     ..........[/quote:bb175c04c7]
按照EndUser的说法,那么p-q应为2(跨越2byte),但运行结果为1,
同样(char *)p-(char *)q应为1?
晕了!!!

 win_hate 回复于:2004-01-07 09:21:15
[quote:cb015680fa="flw"]
呵呵,不错。
[/quote:cb015680fa]

thany you, flw.

 lenovo 回复于:2004-01-07 09:25:22
[quote:f475124557="yangjian73"]
按照EndUser的说法,那么p-q应为2(跨越2byte),但运行结果为1,
同样(char *)p-(char *)q应为1?
晕了!!![/quote:f475124557]
你理解错误,好好看看。

 li2002 回复于:2004-01-07 10:06:47
win_hate的a-b的例子蛮不错的,呵呵,验证了一下,应该是-2

 半颗心 回复于:2004-01-26 15:28:58
[quote:2401a6d048]
#include <stdio.h> 

int 
main (void) 

char buf[8]; 
int *a, *b; 

a = (int *)buf; 
[color=green:2401a6d048]b = (int *) (buf + 2);[/color:2401a6d048] 
printf ("%d\n", b - a); 

a = (int *) buf ; 
[color=red:2401a6d048]b = (int *) (buf + 5);[/color:2401a6d048] 

printf ("%d %d\n", b-a, a-b); 

exit (0); 
} [/quote:2401a6d048]
上面的两个部分我都不太懂!既然(int*)(buf+1)-(int *)buf=sizeof(int)那么就会等于2,可是我一运行却等于零,晕了!

 w25 回复于:2004-01-27 12:17:21
怎么能等于2呢?本来就等于0
假如buf的地址是0x88888888那么buf+1的地址就应该是0x88888888+1吧!那样的话,a的地址0x88888888  b的地址0x88888889
(b的地址-a的地址)/sizeof(int)不够正除,不就等于0了。

 converse 回复于:2004-02-15 19:20:50
在代码:
char buf[8]; 
int *a, *b; 
a = (int *) buf ; 
b = (int *) (buf + 5); 

printf ("%d %d\n", b-a, a-b); 

中a个b差5个字节,一般我们现在X86-32指针为32位,所以

a-b=5

b-a=-5=0xfffffffb

在汇编里除,采用的是SHR,SAR的方法

SAR 5,2 (101-》001)=1

SAR FFFFFFFB,2(FFFFFFFE)= -2


所有的东西到汇编中去解释!!!!!!!

 czj00123 回复于:2004-07-21 02:38:45
能不能这么说,,
地址的'+"跟"-"是以对象来计算的,,short时1个对象是2个字节,而char的一个对象是一个字节,,当short 类型转化为char类型时1个对象就相当于2个char对像,所以输出2,,刚好符合地址计算的原则,,
小弟我只学了几天c语言,,不是之处请莫怪,,,

 polaris_ch 回复于:2004-09-17 10:21:57
[quote:ba678af461="czj00123"]能不能这么说,,
地址的'+"跟"-"是以对象来计算的,,short时1个对象是2个字节,而char的一个对象是一个字节,,当short 类型转化为char类型时1个对象就相当于2个char对像,所以输出2,,刚好符合地址计算的原则,,
小弟我只..........[/quote:ba678af461]

欧是这么理解的:
p,q是short[sizeof(short)=2]型指针,
所以p++,地址加1后,p-q的地址相减为1;
但是因为sizeof(short)=2,虽然p地址只是加1,实际上p,q之间占用的却是2byte,因此p,q字符指针相减(char *)p - (char *)q = 2.

 wcychina 回复于:2004-09-17 19:29:36
就是内存地址偏移的问题 和对象相减的问题  一般来说 对象地址相减 返回的是 之间的对象个数 当然不要加其他的强制函数;
对象地址偏移都是根据类型机器码来定的 地址码是16进制数字
加上char*的强制转换就编程了以 char为单位的地址偏移了 
char的数组地址偏移为1 当然对于一个short偏移来说其相减的值就是2

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有