当在C中减去两个指针时

时间:2016-10-11 19:04:20

标签: c pointers

我正在玩指针以完全获得概念,然后想要减去两个指针,期望这两个地址之间的距离或东西,但显然我错了,所以这是我的代码。

index.html

为什么程序输出int x = 5, y = 7; int *p = &y; int *q = &x; printf("p is %d\nq is %d\np - q is %d", p, q, (p - q)); ?谢谢。

5 个答案:

答案 0 :(得分:11)

这是未定义的行为。根据标准(N1570):

  

6.5.6附加运营商
  ....
   9 当减去两个指针时, 都应指向同一个数组对象的元素,   或者超过数组对象的最后一个元素 ;结果是 的差异   下载 两个数组元素。

请注意,如果允许,则结果为下标差异。因此,如果指针指向同一类型的两个连续元素,则无论类型的大小如何,减法都会给出1。 (这也许就是你在具体案例中得到1的原因。)

答案 1 :(得分:3)

由于pq指向不相关的对象,因此您的特定情况会导致未定义的行为。

只有当p-qp指向同一个数组/同一个数组的最后一个元素之后,才能理解q

int array[10];
int* p = &array[0];
int* q = &array[5];

int ptrdiff_t = q - p;  // Valid. diff1 is 5
int ptrdiff_t = p - q;  // Valid. diff2 is -5
在这种情况下,

q - p为5,因为它们指向的数组元素相隔5个元素。

换句话说,p+5等于q。如果从p开始并跨越数组的5个元素,您将指向q指向的数组的相同元素。

另外,不要使用格式说明符%d来打印指针。使用%p。将%td用于ptrdiff_t

printf(" p is %p\n q is %p\n p-q is :%td", p, q, p-q);`
//            ^^        ^^

有关不同类型的有效格式说明符,请参阅http://en.cppreference.com/w/c/io/fprintf

答案 2 :(得分:1)

指针算法就是这样的。它没有给你两个地址之间的差异。相反,它将显示两个变量之间的差异,就好像它们存储在数组中一样。所以,无论你的变量(相同类型)是4个字节,8个字节还是1个字节,如果存储在相邻的存储器位置,它们的指针减法总是会产生1或-1。

答案 3 :(得分:1)

两个指针相减得出两个变量之间的距离。 例如。

///让a的地址为1000,然后a + 1的地址为1004

int a[]={1,2,3};
int *p1=a;
int *p2=a+1;
printf("%u",p2-p1);

此结果将是1而不是4。 同样在您的情况下,x和y的位置是连续的,这就是为什么ans。是1。

答案 4 :(得分:-1)

将数组中的两个指针相减将得出两个元素之间的距离。

让第一个元素的地址为1000,然后第二个元素a+1的地址为1004。因此,p1 = 1000p2 =1004

p2-p1 = (1004- 1000) /size of int = (1004-1000)/4 =4/4 =1