目录
指针常用运算
定义:
指针与整数值的加减运算
格式:
举例:
说明:
实例
举例:
实例
指针的自增、自减运算
定义
实例1:
实例2:
指针常用运算
定义:
指针本质上就是一个无符号整数,代表了内存地址。
除了上面提到的取址、取值外,指针还可以与整数加减、自增自减、同类指针相减运算等。 但是规则并不是整数运算的规则。
指针与整数值的加减运算
格式:
指针±整数
注:
- 指针与整数值的加减运算,表示指针所指向的内存地址的移动(加,向后移动;减,向前移动)。
- 指针移动的单位,与指针指向的数据类型有关。数据类型占据多少个字节,每单位就移动多少个字节。通过此操作,可以快速定位你要的地址。
举例:
int mainm(){
short m = 10;
short* s = &m;
printf("%p\n", s);//变量m的正常地址
printf("%p\n", s + 1);//变量m位置+1,位置添加2个字节
printf("%p\n", s - 1);//变量m位置-1,位置减少2个字节int n = 20;
int *i = &n;
printf("%p\n", i);
printf("%p\n", i + 1);
printf("%p\n", i - 1);
return 0 ;}
说明:
- s + 1表示指针向内存地址的移动一个单位,而一个单位的short类型占据两个字节的宽度,所以相当于移动两个字节。
变量a、b、c、d、e都是整型数据int类型,它们在内存中占据一块连续的存储区域。指针变量p指向变量a,也就是p的值是0xFF12,则:
说明:
指针p+1并不是地址+1,而是指针p指向下一个数据。比如,int* p,p+1表示当前地址+4,指向下一个整型数据。
实例
int main() {int arr[5]= {11, 22, 33, 44, 55};int* p = &arr[1];printf("p的值为%d\n",*p); //对应的值为22printf("p+1的值为%d\n", *(p + 1)); //对应的值为33printf("p-1的值为:%d\n",*(p - 1)); //对应的值为11return 0;
}
注意:只有指向连续的同类型数据区域,指针加、减整数才有实际意义。
举例:
对于长度是N的一维数组a,当使用指针p指向其首元素后,即可通过指针p访问数组的各个元素。
其中:
- a[0]用*p表示
- a[1]用*(p+1)表示
- a[i]用*(p+i)表示
实例
#include "stdio.h"int main() {//指针进行加减运算,与普通整数加减规则不同, +-指的是地址进行移动,每次一定指定个单位(一个单位指一个数据类型所占的字节个数)short m = 10;short* s = &m;printf(" %p\n",s);//变量m的正常地址 0000009461ff706printf(" %p\n", s + 1);//变量m位置+1,位置添加2个字节 0000009461ff708 +1指的是地址向后移动一个单位(一个单位指一个数据类型所占的字节个数)printf(" %p\n", s - 1);//变量m位置-1,位置减少2个字节 0000009461ff704int n = 20;int *i = &n;printf(" %p\n", i); //000000456edffa08printf(" %p\n", i +1);//000000456edffa0cprintf(" %p\n", i - 1);//000000456edffa04}
指针的自增、自减运算
定义
指针类型变量也可以进行自增或自减运算,如下:
p++、p--、++p、--p
注:++和--,这里针对指针的增加或减少指的是内存地址的向前或向后移动。
对于数组来说,由于数组在内存中是连续分布的:
- 当对指针进行++时,指针会按照它指向的数据类型字节数大小增加,比如int*指针,每++一次,就增加4个字节。
- 当对指针进行--时,指针会按照它指向的数据类型字节数大小减少,比如int*指针,每--一次,就减少4个字节。
实例1:
int main() {int arr[5] = {1, 2, 3, 4, 5};int* p1 = &arr[0];int* p2 = &arr[3];printf("p1的值为:%d\n", *p1); //1printf("++p1的值为:%d\n", *++p1); //2printf("p1的值为:%d\n", *p1); //2printf("p2的值为:%d\n", *p2); //4printf("--p2的值为:%d\n", *--p2); //3printf("p2的值为:%d\n", *p2); //3return 0;
}
实例2:
请分析下面几种情况。
初始情况:
int a[5] = {10,20,30,40,50};
情况1:
int* p = a; //p开始时指向数组a的首元素 等同于 int* p = &a[0];p++; //使p指向下一元素a[1]printf("%d\n",*p); //得到下一个元素a[1]的值,即20
情况2:
int* p = a; //p开始时指向数组a的首元素
printf("%d\n",*p++); //10
printf("%d\n",*p); //20