1.指针的定义
- 指针是内存中一个最小单元的编号,也就是地址
- 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
int *p = NULL;可以类比int a = 0;NULL就像当于0,指针初始化。
总结:指针就是地址,口语中说的指针通常指的是指针变量。也就是内存
2.指针的类型
我们给指针变量相应的类型。
char *pc = NULL; char*就是存放char类型的地址
int *pi = NULL; int*就是存放int类型的地址
short *ps = NULL; short *就是存放short 类型的地址
long *pl = NULL; long*就是存放long类型的地址
float *pf = NULL; float*就是存放float类型的地址
doutle *pd=NULL; doutle*就是存放doutle类型的地址 4
int* 访问4个字节,将4个字节的内容都变为0.
char*访问1个字节,就将1个字节的内容变为0.
2.1指针+ - 整数
就如上图,指针的类型决定了指针向前或者向后走一步有多大(距离)
2.2指针的解引用
如上述所说:指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
3.野指针
野指针的成因
- 指针未初始化
- 指针越界访问
- 指针指向的空间释放
1.未初始化
2.指针越界访问,数组本有10个元素,可是访问了11个元素。越界访问了。
3.2 如何规避野指针
-
指针初始化
-
小心指针越界
-
指针指向空间释放,及时置NULL
-
避免返回局部变量的地址
-
指针使用之前检查有效性
对于指针初始化用NULL。
4.指针的运算
(1)指针+-整数
指针的类型决定了指针向前或者向后走一步有多大
(2)指针-指针
可以这样理解 日期+日期? 啥都不是, 日期-日期=天数
所以指针-指针= 元素个数
5. 指针和数组
数组和指针不是一个东西
数组能够存放一组数,连续的空间,数组的大小取决于元素个数指针是一个变量,是存放地址的,4/8个字节
联系就是:
数组名是地址(指针)
数组把首元素的地址,交给一个指针变量后可以通过指针来访问数组
6.二级指针
对于二级指针的运算有:
*ppa通过对ppa中的地址进行解引用,这样找到的是 pa, *ppa其实访问的就是 pa.
**ppa先通过 *ppa找到 pa,然后对 pa进行解引用操作: *pa,那找到的是 a.