本篇文章文字篇幅较大, 还是希望能耐心看完. 不过, 学习不就是这样嘛, 要奶得住寂寞,虽然不一定变强, 但一定变老.
目录
初识地址
在计算机的存储空间中, 存储数据是以字节为单位, 每个字节都有自己的编号, 在32位平台下,这种编号的长度占32个bit位 (在64位平台下,长度就占64个bit位), 当我们需要找到这些字节的时候, 这些编号就作为地址存储到变量中, 顺着这种变量, 就可以找到要找的字节, 这种变量呢, 我们称它为指针.
初识指针
好! 经过上一段文字,我们已经知道: 将那些字节的编号作为地址存放到变量中, 这个变量就是指针, 那就再深入的想想, 指针存放的是长达32个bit位的地址, 那就说明指针的长度就是4个字节, 当系统是64位时, 那指针就是8个字节.
总结, 我们发现指针的大小是由系统决定的, 并且一次只能指向一个字节.
指针的工作原理
可以说每个类型都有其对应的指针, 在这里, 我们拿 整形int 和 字符型char 来看一下指针到底是如何工作的.
int类型变量占4个字节, 对应的指针类型为 int * ,char类型变量占1个字节, 对应的指针类型为: char *
int a = 5;
char b = A;
int *pa = &a;
int *pb = &b;
在这里 指针 pa 指向的是 变量a的第一个字节, 但是指针pa的类型: 整形指针 决定了: 如果指针pa要访问变量a中的内容, 就需要继续访问紧接着的3个字节.,如此才算是完整的访问了一个整型变量.
指针pb 指向的是 变量b的第1个字节, 而变量b又只有1个字节, 所以 指针pb的类型: 字符型指针 决定了: 如果指针pb要访问变量b中的内容, 只用访问当前指向的指针.
总结: 指针的类型对指针非常重要, 决定了对指针解引用的时候需要操作几个字节. 同样在不同类型的数组中, 指针向前或向后访问的步长也由指针决定.
野指针
概念: 野指针就是指针指向的位置是不可知的( 随机的, 不正确的, 不明确的 )
野指针的成因:
1, 指针使用前未初始化;
使用前不初始化, 默认为随机值.
2, 指针越界访问;
当指针的指向超出已知的范围, 该指针就是野指针.
3, 指针指向的空间被释放;
规避野指针:
1, 指针初始化
2, 小心指针越界
3, 指针指向空间释放, 及时置NULL
4, 避免返回局部变量的地址
当函数调用结束后返回, 函数的栈帧空间被释放, 如果返回的是函数内部的局部变量, 会因为函数栈帧的空间被释放, 导致指针指向未知. 所以要避免返回局部变量的地址.
5, 指针使用之前检查有效性
二阶指针
了解指针的原理后, 二阶指针就很容易理解了. 二阶指针就是指向指针的指针,
int * p = NULL;
int **pp = &p ;
二阶指针pp 的类型为 int**, &p的类型为 int** ; p的类型为 int * ; 指针pp也是指向指针p的第一个字节, 指针pp的类型决定了 其解引用时,操作4个字节, 向前或向后访问的时候的步长也是4个字节.
我是专注学习的章鱼哥~