指针的运算
指针变量中存储的就是整数,因此整型数据能使用的运算符指针变量基本都能使用,但不是所有的运算都有意义
指针进行前后移动
指针 + 整数 = 指针 + 宽度 × 整数
指针 - 整数 = 指针 - 宽度 × 整数
两个指针之间相隔多少个元素
指针 - 指针 = (指针 - 指针) / 宽度
可以判断两个指针谁在前谁在后
指针 关系运算符 指针 (< 、> 、>= 、<=)
注: 使用 %p,可以十六进制的方式显示指针
数组与指针
数组名就是个特殊的指针,数组名是个常量(数组名与数组第一个元素的首地址是对应关系,普通指针是指向关系,普通指针有自己的存储空间)
int arr[10] = {1,2,3,4,5};
printf("%p %p\n",arr,&arr);
int* p = arr;
printf("%p %p\n",p,&p);
打印值: arr = &arr = p != &p (普通指针有自己的存储空间)
注:&arr + 1 加的是数组宽度
数组名可以使用指针的解引用,而指针变量也可以使用数组的[ ];
arr[i] <=> *(arr+i)
数组指针与指针数组
数组指针(指针):专门用来指向数组的指针
int arr[10]; --> int* p = arr;
int (*p)[10]; --> int (*p)[10] = &arr;
指针数组(数组):一个数组里面存储的数据类型是指针
int* arr[3]; <=> int *p1,*p2,*p3;
指针与const
const int * p; 和 int const * p;
const修饰 *p,指向内存,保护的是解引用
注意:不能通过解引用去修改指针所指向的内存的数据,因为 *p 不能修改
1、保护函数的参数
2、当指针指向的是只读数据时,也应该加上const,防止出现段错误
int * const p;
const修饰 p,保护的是p这个变量 -> p这个变量的值一旦初始化了就不能改,即不能修改指针变量的值
可以防止指针变量意外变成野指针
const int * const p;和int const * const p;
既保护指针所指向的内存,也保护指针变量