野指针是指未初始化的指针
空指针 p=NULL;,不一定是内存首地址,不同编译器处理结果不一样。为了安全性,一般定义指针的初始化为空指针;
使用空指针,编译会报错,使用野指针,有的编译器编译不报错。
指针本质上是一个变量,那么const修饰的指针到底是修饰指针本身还是修饰指针所指向的变量?
一、指向const变量的指针
1、const int *p=NULL;
2、int const *p=NULL;
如果一个变量已被声明为常变量,只能用 指向const变量 的指针指向它,而不能用一般的( 指向非const型变量)
指向const变量的指针除了可以指向常变量外,还可以指向普通变量。此时可以通过指针访问该变量,但不能通过指针改变该变量的值,用该指针访问时,该变量具有const变量的特征,本身仍然是普通值可变的变量
指向const变量的指针最常用于函数的形参,目的是在保护形参指针所指向的实参变量,使它在函数的执行过程中不被修改,如字符串处理的库函数。但是在函数的调用时,对应的实参既可以是指向const变量的指针,也可以是指向非const变量的指针,因此尽可能采用指向const变量的指针。与此相同的情况还有常引用。
二、const 指针
int a=3;
int * const p=&a;
const 直接放在指针变量名字的前面,直接修饰指针变量,表示指针变量的值不能改变,称p为常指针变量,简称常指针或const指针,定义const指针的同时必须要初始化。p的指向不能改变,但是p指向的单元没有const修饰,因此可以通过指针p来修改它指向的单元的内容。
三、指向const变量的const指针
int a=3;
const int*const p=&a;
指针变量本身不能改变,即指针的指向不能改变;指针指向的单元的内容不能通过指针来改变;
小结:
const 有两个位置,可以形成三种指针:
(1) 只在 * 之前有const 的指针,称为指向 const 变量的指针
(2) 只在 * 之后有const 的指针,称为 const 指针
(3)* 前后都有const 的指针,称为 指向 const 变量的const 指针
void 指针 无类型指针 可以指向任何数据类型的数据
如果将函数的参数和返回值都设置为void型,就可以增加函数的通用性,这有点像抽象的意思,与面向对象息息相关。