目录
一,指针的定义
指针就是地址,口语中说的指针通常指的是指针变量。
注:指针的大小在32位平台是4个字节,在64位平台是8个字节
二,指针和指针类型
指针的形式:type+* 比如:char*
指针类型的意义:
1,不同的指针步长不同:int*+1走四个字节,char*+1走一个字节
2.指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。
补充:经过实验发现,变量的地址,其实就是低地址字节的地址,比如0x11223344,其中44存储在较低的地址的字节中,那么整个数据的地址就是44的地址,如果用char*访问,也是从44开始访问
三,野指针
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
3.1野指针成因
1.指针未初始化。
2.当指针指向的位置超出数组范围的时候,就会变成野指针。
3,指针指向的空间被释放,比如说:一个指针指向函数内部的局部变量,在函数调用完毕后,局部变量所占用的内存被释放,指针变成野指针。
3.2如何规避野指针
1. 指针初始化
2. 小心指针越界
3. 指针指向空间释放,及时置NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性
四,指针的运算
4.1指针加减整数:走步长
4.2指针减指针:得到的是两个地址之间的元素个数
4.3指针的关系运算
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与
指向第一个元素之前的那个内存位置的指针进行比较
五,指针和数组
已经很熟悉了,需要说的是:arr[i]==*(p+i)==*(i+p)==i[arr],,可能你觉得这很奇怪,但是实际上[]只是个操作符,i和arr也只是个操作数而已,没有规定说必须写成arr[i]。
所以 p+i 其实计算的是数组 arr 下标为i的地址,即*(p+i)==arr[i]
六,二级指针
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?
int a=10;
int * pa=&a;这里*pa代表指针,int 说明指针指向int类型
int* * ppa=&pa;这里*ppa代表指针,int*说明指针指向int*类型,也就是指向指针。
七,指针数组
指针数组是一个存放指针的数组。例如:int* arr[]={&a,&b,...............};