在整数数组的情况下,指针减法究竟是如何工作的?

时间:2015-07-08 12:14:54

标签: c pointers pointer-arithmetic

scipy.optimize.minimize

对于第一个#include<stdio.h> int main() { int arr[] = {10, 20, 30, 40, 50, 60}; int *ptr1 = arr; int *ptr2 = arr + 5; printf("Number of elements between two pointer are: %d.", (ptr2 - ptr1)); printf("Number of bytes between two pointers are: %d", (char*)ptr2 - (char*) ptr1); return 0; } 语句,根据Pointer subtraction confusion

,输出将为printf()

第二个5语句怎么样,输出是什么?

4 个答案:

答案 0 :(得分:9)

引用C11,章节§6.5.6,添加剂操作符

  

当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素;结果是两个数组元素的下标不同。

所以,当你在做

printf("Number of elements between two pointer are: %d.", 
                            (ptr2 - ptr1));

ptr1ptr2都是指向int的指针,因此它们给出了下标5中的差异。换句话说,地址的差异在参考sizeof(<type>)

OTOH,

 printf("Number of bytes between two pointers are: %d",  
                          (char*)ptr2 - (char*) ptr1);

ptr1ptr2已经指向char的指针,该指针的大小为1个字节。计算相应地进行。结果:20

FWIW ,请注意,减去两个指针会产生ptrdiff_t类型的结果,您应该使用%td格式说明符来打印结果。

答案 1 :(得分:5)

如果有两个类型为T的指针指向同一个数组的元素,那么指针的差异会产生这些指针之间类型T的元素数

所以第一个输出语句

printf("Number of elements between two pointer are: %d.", 
                            (ptr2 - ptr1));

输出5 - 指针intptr1之间类型ptr2的元素数。

这就是所谓的指针算法。

指针(char*)ptr1(char*)ptr2具有与原始指针ptr1ptr2相同的值,但是他们将内存范围视为(重新解释)为类型{{ 1}}每个元素的大小等于char。在C sizeof( char )中始终等于1。 因此,差异sizeof( char )给出了可以适合内存范围的( char * )ptr2 - ( char * ) ptr1类型的元素数。很明显 char不大于sizeof( char )。因此,相同的内存范围可以容纳sizeof( int )类型的更多元素而不是类型char。如果例如int等于sizeof( int ),那么内存范围可以容纳4 5 * sizeof( int )类型的char元素。

答案 2 :(得分:4)

指针算术总是以基本类型为单位。

在你的情况下,你有

int *ptr1 = ...

然后执行ptr1 + 5会将sizeof(*ptr1) * 5 字节添加到指针ptr1。考虑到sizeof(*ptr1)(与sizeof(int)相同)是4,那么您得到的4 * 5等于20个字节。

答案 3 :(得分:4)

每个数组元素都是int,两个指针之间都有5个元素。因此,两个指针之间将有5*sizeof(int)个字节。