2011-03-29 57 views
-1

考虑以下PROGRAMM,关于在C指针

#include<stdio.h> 
int main() 
{ 
    int marks[]={20,65,45,68,89}; 
    int *x,*y; 
    x=&marks[2]; 
    y=&marks[4]; 
    printf("%p\n%p\n"x,y); 
    printf("%p\n%p\n",y-x,*y-*x); 
    return 0; 
} 

当我想打印出来的y-x值,控制台应该给我等于相应指针的地址之间的差值输出。毕竟,我们知道xy具有地址('某个整数值')。但事实并非如此。为什么?

+0

你得到的输出是什么? – 2011-03-29 11:46:41

+1

你能改述并删除blockquote吗?你为什么要调用stackoverflow先生? – 2011-03-29 11:46:46

回答

0

的距离控制台必须给我等于相应的指针

的地址之间的差值输出...和它。对我来说,它输出2。如果您比较地址,则会看到它们被8个字节分隔,即2 int s,这是您寻求的答案。

2

如果您使用%p打印差异,您可能会遇到难以阅读的内容。

正确的方法可能是使用%lu个,并投:

printf("%lu\n", (unsigned long) (y - x)); 

打印整型量*y - *x为%P似乎完全糊涂了。

+0

只是为了澄清(对于OP):按定义减去指向同一对象的两个指针将产生一个intptr_t类型的R值。因此,这种类型转换不需要将指针转换为整型,但要确保指针算术产生的整数正确地传递给由printf解释的任何类型。 – datenwolf 2011-03-29 12:24:33

3

指针减法不是简单地减去地址,而是返回两个数组元素之间的距离(按照元素)。

所以y - x不是指针,但价值2的整数 - 和给printf,你shold使用%d格式,现在%p

+0

从技术上讲,我们不知道格式是否也是%d,这取决于ptrdiff_t有多大。 – 2011-03-29 12:26:48

1

在同一个数组中减去2个指针的结果是数组中指针之间的距离,所以y-x在你的例子中应该等于2。

为了让他们投给某个整数地址间的差从其减去前:

printf("%d",(size_t)y-(size_t)x); 
1

y-x将评估为2 - 因为它们之间是2个整数的距离。

如果您打印例如(char *) y - (char *) x你会得到字符