1. 指针是什么?
指针理解的
2
个要点:
1.
指针是内存中一个最小单元的编号,也就是地址
2.
平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
总结:指针就是地址,口语中说的指针通常指的是指针变量。
指针变量:我们可以通过 & (取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量
#include <stdio.h>
int main()
{
int a = 10;//在内存中开辟一块空间
int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
//a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量
中,p就是一个之指针变量。
return 0;
}
所以我们可以得知指针变量是用来存放地址的变量。(存放在指针中的值都被当成地址处理)。同时指针的大小在32位平台是4个字节,在64位平台是8个字节。
2.指针的类型
指针也是有类型的。在定义变量之后,我们要将变量的地址存起来,就需要用与变量相应的类型来存储。
从这段简单的代码就可以看出来,指针的定义方式是: type + * 。
以此类推:char* 类型的指针是为了存放 char 类型变量的地址。short* 类型的指针是为了存放 short 类型变量的地址。int* 类型的指针是为了存放 int 类型变量的地址。
那么指针的类型又什么用呢???大小不都是4或8字节吗?那存储大小都一样,用什么类型不都可以吗?
别急,下面会有解答~
2.1指针加减整数
从图中打印的地址我们可以看出, 指针加减整数“走的距离”由其自身的类型决定。
2.2指针的解引用
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
比如:
char*
的指针解引用就只能访问一个字节,而
int*
的指针的解引用就能访问四个字节。
3.野指针
野指针就是指针位置没有明确。指向的位置是不可知的。
3.1野指针成因
1.指针未初始化
2.指针越界访问
3.指针指向的空间释放
3.2如何避免野指针
1. 指针初始化2. 小心指针越界3. 指针指向空间释放,及时置 NULL4. 避免返回局部变量的地址5. 指针使用之前检查有效性
4.指针和数组
我们可以看到p+i
其实计算的是数组
arr
下标为
i
的地址。 所以我们就可以直接通过指针来访问数组。
5.二级指针
指针变量也是有地址的,存放指针变量地址的指针就是二级指针。
对于二级指针的解引用其实就是找到它存储的指针变量,如上图*ppa找到的就是pa,那么再*pa找到的就是a了。
6.指针数组
数组我们了解了整型数组、字符数组等等,那指针数组就是存储指针的数组。
举个例子:
arr[i]相当于找到每个数组的首元素地址,+j相当于根据指针类型决定步长来访问数组元素的地址,最后再解引用就可以得到数组元素。