指针的算术运算

指针的算术运算

指针二点算术运算分为两种:

指针 ± 整数

当一个指针和一个整数量执行算术运算时,整数在执行加减法运算前始终会根据合适的大小进行调整。这个“合适的大小”就是指针所指向类型的大小。例如:

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 所指向的类型为inta+1即为首地址+ sizeof(int),所以指向下一个int型元素。

&a所指向的类型是一个数组,&a+1即为首地址+sizeof(a),即首地址+5*sizeof(int),所以ptr其实已经超过了数组界限,并且刚好是数组后面的第一个地址。

ptrint*类型的,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,它是一种有符号整数类型。

两个指针相减的值是指两个指针在内存中的距离(以数组元素的长度为单位,而不是以字节为单位)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值