当在C中减去两个指针时

Kam*_*kou 1 c pointers

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

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));
Run Code Online (Sandbox Code Playgroud)

为什么程序输出p - q is 1?谢谢.

Ale*_*exD 12

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

6.5.6加法运算符
....
9当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素 ; 结果是两个数组元素的下标的差异.

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

  • 好吧,不能保证这些位置在内存中是相邻的,因此它至少是实现定义的. (2认同)

R S*_*ahu 5

您的特殊情况是导致未定义行为的原因,因为pq指向不相关的对象。

p-q仅当pq指向同一数组/同一数组的最后一个元素之后,您才能理解。

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

ptrdiff_t diff1 = q - p;  // Valid. diff1 is 5
ptrdiff_t diff2 = p - q;  // Valid. diff2 is -5
Run Code Online (Sandbox Code Playgroud)

q - p在本例中为 5,因为它们指向数组中相距 5 个元素的元素。

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


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

printf(" p is %p\n q is %p\n p-q is :%td", p, q, p-q);`
//            ^^        ^^
Run Code Online (Sandbox Code Playgroud)

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

  • 您应该使用类型“ptrdiff_t”进行指针减法。至于打印指针值,参数不应该是“(void*)p”吗? (4认同)