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

Rav*_*avi 3 c pointers pointer-arithmetic

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

对于第一个printf()语句,输出将5根据Pointer减法混淆

第二个printf()声明怎么样,输出会是什么?

Sou*_*osh 9

引用C11,章节§6.5.6,添加剂运算符

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

所以,当你在做的时候

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

两者ptr1ptr2是指向int,因此它们是给换句话说中下标,5差,该地址的差在参考计数sizeof(<type>).

OTOH,

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

ptr1ptr2浇铸到一个指针char,其中有一个1个字节的大小.计算相应地进行.结果:20.

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


Vla*_*cow 5

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

所以第一个输出语句

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

输出5 - int指针ptr1和类型之间的类型元素数ptr2.

这就是所谓的指针算法.

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