本章讲述指针,指针是一个难点,也是一个重点!!!
这一小节分为六个板块来讲:
一、指针的定义;
二、指针变量;
三、访问指针指向的变量;
四、声明指针变量;
五、未被初始化的指针(野指针);
六、空指针
一、指针的定义
(1)地址和指针
变量的本质是什么?内存中的存储单元,即每一个变量都需要在内存中分配一块空间来保存它的值,如int a = 5;编译器需要在内存中分配4个字节来存储5这个值。
数据保存在内存中,而每一块内存空间都有一个编号,占用4个字节称为内存地址,如 0×12FF3C,用来表示这个地址编号的变量称为指针变量。
通过指针可以访问和处理指针所指向的变量,增加了访问数据的手段,使程序更加灵活。
![](https://www.artisanbox.org/wp-content/uploads/2017/07/Screenshot_2017-07-26-14-41-54-176-300x184.png)
指针本身也是一个变量,它存储的是另一个变量的地址。
存放变量地址的变量是指针变量,因此,一个指针变量的值就是某个变量的地址。为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”。
char aChar = ‘G’;
char *p = &aChar;
- *p表示指针变量基本的名字;
- *表示p是一个指针变量,可以存储一个变量的地址;
- &表示取地址运算符,返回变量的地址编号;
二、指针变量
指针变量适用于存储另一变量的地址,它具有以下四个特点:
①它的值是一个地址:
②指针变量的值可以改变,存储一个新的地址,即指向别的变量;
三、访问指针指向的变量
通过指针变量可以间接访问指针所指向的变量的值。
对于右图所示的存储结构,想要访问内存中的5这个值,有两种方式:
(1)通过变量名 a;
(2)通过*p对指针解引用;
间接运算;
把运算符*放在指针名前面就可以访问指针所指向的变量
设已定义好的整数型变量a和整数型变量pa,且pa指向变量a,则printf(“%d”,pa);//输出pa指向变量的值,即输出a的值
*pa = 100;//给pa所指向变量赋值100,即给a赋值100,等价于a = 100;
结论:指针指向谁,解引用就是谁!
四、声明指针变量
例如;
char *p;
int *q;
float *r;
long double *s;
long int *t;
注意;声明指针变量的类型应和指针所指向的变量的类型保持一致。
五、未被初始化的指针
任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。
如定义int *p;则指针变量p未被初始化,它的指向是不明确的。
注意:因为野指针指向的内存空间位置不明确,因此不要对野指针解引用。
当一个指针成为“野指针”时,它指向哪里就是不可预知的了。当使用这个“野指针”时,即使程序运行没有问愿那也是非常危险的。因为这个“野指针”指向的内存空间,可能是某个重要的数据或其它程序,芸至是系统的重要内存位置。这样造成的危害是不可预知的,这个不可预知包括危害程度的不可预知和危害时间的不可预知的、像一颗不知何时会爆的定时炸弹。
六、空指针
指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存,否则它就是一个野指针。所以当我们不知道应该将指针指向何处时,应将指针置为NULL。
int *p = NULL;
指针是指向为NULL,它的值是0×0,即0号地址单元,永远不要试图去访问空指针指向的内容,因为它是系统内存单元,不允许用户级别的程序去访问,即对空指针解引用是非法的,会造成segmcnmtion fault(段错误)。
输出结果:0000000
空指针与野指针的区别:
野指针:未被初始化的指针,里面的内容是垃圾地址,它的值是不明确的;
空指针:被初始化为NULL的指针,里面的地址是0;
注意:不要解引用空指针或野指针