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()声明怎么样,输出会是什么?
引用C11,章节§6.5.6,添加剂运算符
当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素; 结果是两个数组元素的下标的差异.
所以,当你在做的时候
printf("Number of elements between two pointer are: %d.",
(ptr2 - ptr1));
Run Code Online (Sandbox Code Playgroud)
两者ptr1并ptr2是指向int,因此它们是给换句话说中下标,5差,该地址的差在参考计数sizeof(<type>).
OTOH,
printf("Number of bytes between two pointers are: %d",
(char*)ptr2 - (char*) ptr1);
Run Code Online (Sandbox Code Playgroud)
既ptr1和ptr2被浇铸到一个指针char,其中有一个1个字节的大小.计算相应地进行.结果:20.
FWIW,请注意,减去两个指针会产生结果类型,ptrdiff_t您应该使用%td格式说明符来打印结果.
如果你有两个指向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 )类型的元素char是20.