指针算术输出错误

在下面的程序中,Here ptr已被声明为指向整数指针的指针,并分配了数组p[]的基址,该数组已被声明为整数指针数组。 假设ptrptr递增之前包含地址9016 (假设p的起始地址是9016),并且在ptr++ ,它将包含值9020(假设int占用4个字节)。

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

 #include 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; } 

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

 int **ptr=p; ptr++; 

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

顺便说一句,这种行为与ptr++一致(这意味着ptr = p + 1;在你的例子中)。

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

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

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

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

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

它将打印4。