指针算术输出错误

时间:2014-10-02 08:27:27

标签: c pointers pointer-arithmetic

在下面的程序中,这里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;
}

3 个答案:

答案 0 :(得分:8)

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

int **ptr=p;
ptr++;

ptr向前移动一个元素,因此ptr - p的值为1

顺便说一句,此行为与ptr++一致(在您的示例中表示ptr = p + 1;

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

当您找到两个指针之间的差异时,您将获得它们之间的对象数量。 在这种情况下,由于对象的类型为整数,因此您正确获得值1.

如果你想知道字节数值,你应该这样做:

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

将打印4。