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、示例
通过这些示例,都可以看到偏移的字节数都是前面提到固定套路计算出来的。