2014-10-02 62 views
2

在下面的程序中,这里ptr已被声明为指向整型指针的指针,并且指定了数组p[]的基址,该数组已被声明为整型指针数组。假设ptr包含地址9016(假设p的起始地址是9016),在ptr递增之前和ptr++之后,它将包含值9020(假设int需要4个字节)。指针算术错误输出

所以ptr-p应该给出输出为4即(9020-9016 = 4)。但它将输出结果设为1。为什么?

#include<stdio.h> 
int main() 
{ 
    static int a[]={0,1,2,3,4}; 
    static int *p[]={a,a+1,a+2,a+3,a+4}; 
    int **ptr=p; 
    ptr++; 
    printf("%d",ptr-p); 
    return 0; 
} 
+0

单独将指针转换为整数类型,然后才减去。 – 2014-10-02 09:40:58

回答

8

一个指针的结果减去另一个指针是元件它们之间,而不是字节数的数量。

int **ptr=p; 
ptr++; 

ptr向前移动一个元件,所以ptr - p具有1的值。

顺便说一句,这种行为是ptr++(这意味着在您的示例ptr = p + 1;一致。

+0

谢谢@yu Hao thanki – Walter 2014-10-10 12:25:35

2

从相同的基本类型的另一个指针的指针中减去返回一个整数,其表示的该元素的数量在两者之间指针。

如果我们有2指针2个int指针p1p2,包含地址1000和1016分别接p2-p1会给4(因为int 4大小)。

1

当您找到两个指针之间的差异时,您将获得它们之间的对象数量。 在这种情况下,对象是整​​型的,你得到了正确的价值1

如果你想知道以字节为单位的值,那么你应该做的:

printf("%d",(char *)ptr-(char *)p); 

这将打印4。