指针算术输出错误
在下面的程序中,Here ptr
已被声明为指向整数指针的指针,并分配了数组p[]
的基址,该数组已被声明为整数指针数组。 假设ptr
在ptr
递增之前包含地址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
指针p1
和p2
,分别包含地址1000和1016,则p2-p1
将给出4
(因为int
4的大小)。
当您找到两个指针之间的差异时,您将获得它们之间的对象数。 在这种情况下,由于对象的类型为整数,因此您正确获得值1。
如果你想知道以字节为单位的值,你应该这样做:
printf("%d",(char *)ptr-(char *)p);
它将打印4。