int *p;
printf("p = %p.\n", p); // %p打印指针和%x打印指针,打印出的值是一样的
printf("p = 0x%x.\n", p);
// 第二步,绑定指针,其实就是给指针变量赋值,也就是让这个指针指向另外一个变量
// 当我们没有绑定指针变量之前,这个指针不能被解引用。
p = &a; // 实现指针绑定,让p指向变量a
p = (int *)4; // 实现指针绑定,让p指向内存地址为4的那个变量
// 第三步,解引用。
// 如果没有绑定指针到某个变量就去解引用,几乎一定会出错。
*p = 555; // 把555放入p指向的变量中
(1)当我们**int \*p定义一个指针变量p时**,因为p是**局部变量**,所以也遵循C语言局部变量的一般规律(定义局部变量并且未初始化,则值是随机的),所以此时p变量中**存储的是一个随机的数字**。
(2)此时如果我们**解引用p**,则相当于我们**访问了**这个**随机数字为地址的内存空间**。那这个空间到底能不能访问不知道(也许行也许不行),所以如果直接定义指针变量未绑定有效地址就去解引用就有可能会出现错误。
(3)定义一个指针变量,**不能**不经绑定有效地址就去解引用。
(4)指针绑定的意义就在于:让指针指向一个可以访问、应该访问的地方,指针的**解引用是为了间接访问目标变量**。
---
**4.什么是野指针?**
(1)野指针,就是指针指向**随机的、不正确的、没有明确限制**的的位置**。**
(2)指针变量在定义时如果未初始化,值也是随机的,很可能触发运行时**段错误。**
(3)野指针因为指向地址是不可预知的,所以有**3种情况**:
**第一种:**是指向不可访问,操作系统不允许访问的敏感地址,譬如内核空间的地址,结果是触发段错误。
**第二种是指向一个可用的、而且没什么特别意义的空间**(譬如我们曾经使用过但是已经不用的栈空间或堆空间),这时候程序运行不会出错,也不会对当前程序造成损害。
**第三种情况就是指向了一个可用的空间,而且这个空间其实在程序中正在被使用**(譬如说是程序的一个变量x),那么野指针的解