指针的算术运算
指针二点算术运算分为两种:
指针 ± 整数
当一个指针和一个整数量执行算术运算时,整数在执行加减法运算前始终会根据合适的大小进行调整。这个“合适的大小”就是指针所指向类型的大小。例如:
int* a; int* b = a+1; 则 b - a = sizeof(int)
char* a; char* b = a+1; 则 b - a = sizeof(char)
# include <stdio.h>
int main(void)
{
int a[5] = {1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d\n",*(a+1));
printf("%d\n",*(ptr-1));
return 0;
}
结果是 2 5
可知,a+1
是数组下一个元素的地址,而&a+1
是下一个对象的地址,其中 a
所指向的类型为int
,a+1
即为首地址+ sizeof(int)
,所以指向下一个int型元素。
而&a
所指向的类型是一个数组,&a+1
即为首地址+sizeof(a)
,即首地址+5*sizeof(int)
,所以ptr
其实已经超过了数组界限,并且刚好是数组后面的第一个地址。
ptr
是int*
类型的,ptr-1
为首地址 - sizeof(int*)
,又刚好是a[4]。
用数字来描述,即假若数组首地址是 10001
那么*(a+1)
就指向 10005 (int占4字节)
那么 ptr 就指向 10021 (数组末尾是10020,数组整个占4*5)
*(ptr-1)就指向 10017 (指针占4字节)
刚好是a[4],即a[0] + 4,即 10001 + 4*4.
指针 - 指针
只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针。
两个指针相减的结果的类型是ptrdiff_t,它是一种有符号整数类型。
两个指针相减的值是指两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位)。