在下面的程序中,这里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 :(得分:8)
一个指针减去另一个指针的结果是它们之间的元素的数量,而不是字节数。
int **ptr=p;
ptr++;
ptr
向前移动一个元素,因此ptr - p
的值为1
。
顺便说一句,此行为与ptr++
一致(在您的示例中表示ptr = p + 1;
。
答案 1 :(得分:2)
从相同基类型的另一个指针中减去指针会返回一个整数,表示两个指针之间的元素数。
如果我们有2个指针int
指针p1
和p2
,分别包含地址1000和1016,那么p2-p1
会给4
(因为大小) int
4)。
答案 2 :(得分:1)
当您找到两个指针之间的差异时,您将获得它们之间的对象数量。 在这种情况下,由于对象的类型为整数,因此您正确获得值1.
如果你想知道字节数值,你应该这样做:
printf("%d",(char *)ptr-(char *)p);
将打印4。