| 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
|