轻松搞定指针偏移

1、指针移动(指针偏移或地址偏移)

指针移动指的是指针保存的地址变化了,比如说保存的地址为0x01给地址+1,变为了0x02,这里的+1就是偏移量。这样原来保存的地址是0x01,偏移之后变为了0x02。

注意:地址是常量,是不可以被改变的,这里的给地址+1只是一个描述,具体的操作是要给指针+1,改变指针保存的地址的值

2、指针如何进行偏移

直接给指针进行加和减就可以了

    int a = 10;
    int *p = &a;
    printf("p保存的地址:%p\n", p);
    p + 1;
    printf("p+1之后p的地址:%p\n", p);
    p - 1;
    printf("p-1之后p的地址:%p\n", p);
    //p * 1;    //错误
    //p / 1;    //错误

如果只是如上进行p+1,p-1这类操作不会改变指针保存的地址。

    int a = 10;
    int *p = &a;
    printf("p保存的地址:%p\n", p);
​
    p += 1;     //可以修改指针p保存的地址
    printf("p+=1之后p的地址:%p\n", p);

是有对指针进行赋值操作的就可以改变指针保存的地址的值。

解释:地址是常量不可以更改,但是地址+1给指针赋值是可以的,比如数字3也是常量,3=4,这样不行,不能对常量赋值,但是有变量a,可以a=3+1

3、指针偏移会移动多少个字节

前面的示例可以看到指针p+=1,往后移动了4个字节的数据。这里会纳闷,+1,怎么移动了4个字节?这里就和指针的类型有关的了,指针在+或-操作的时候移动几个字节要根据指针的类型的决定。

这里可以根据下面的固定套路来计算出移动了多少个字节

类型* p;
p += N;
移动字节数为:类型大小(指针类型去掉一个*) * N

根据这个固定套路来看前面的示例

int *p;
p += 1;

移动的字节数为:int类型大小 * 1 = 4,移动4个字节,由于是+,所以是原来保存的地址的值+4。

如果是其他的指针类型同理操作。

注意:p+1,p-1这种没有对这种进行重新赋值的操作是不会修改指针所保存的地址,他们的意思访问从当前指针保存的地址往后偏移N个字节地址上的数据,类似变量a+2,不会对变量a进行修改,但是可以访问变量a+2之后的值

注:没有特别说明,+ 的操作是往后移动,地址的值会变大,- 的操作是往前移动,地址的值会变小。这里所提到的指针偏移只适用于普通的数据类型定义的指针,比如结构体指针,类类型指针,基本数据类型指针,多级指针等,如果是特殊的指针,数组指针,函数指针等特殊的指针不设用这个固定套路

4、示例

通过这些示例,都可以看到偏移的字节数都是前面提到固定套路计算出来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值