C++ 指针知识点

一、野指针(invalid指针 或者无效指针)

指向一块未知区域的指针是野指针 

例如 int *p = 0x123456; 这就是一个野指针,我们并不知道这个地址存的是什么内容

1、没有使用“有效”的地址,给指针初始化

int *p =NULL;//定义一个空指针*p =300;//*p 所指向的内存空间,是一个“无效访问区域”。

2.指针被free或者delete之后,没有设置为NULL,让人误以为这是一个合法指针。
free和delete只是把指针所指向的内存给释放掉,但并没有把指针本身给清理掉。这时候的指针依然指向原来的位置,只不过这个位置的内存数据已经被毁尸灭迹,此时的这个指针指向的内存就是一个垃圾内存。但是此时的指针由于并不是一个NULL指针(在没有置为NULL的前提下),在做如下指针校验的时候.

if(p != NULL)

会逃过校验,此时的p不是一个NULL指针,也不指向一个合法的内存块,造成会面程序中指针访问的失败。

3、p 指针变量有值,但是该值不是一个有效地址

 int *p; //没有给 p 指定一个有效的地址*p =100;

二、空指针

空指针是一个特殊的指针,因为这个指针不指向任何地方。这意味任何一个有效的指针如果和空指针进行相等的比较运算时,结果都是false。

在程序中,得到一个空指针最直接的方法就是运用预定义的NULL,这个值在多个头文件中都有定义。

int *ip = NULL;

NULL指针是一个标准规定的宏定义,用来表示空指针常量。在C++里面被直接定义成了整数立即数的0,而在没有__cplusplus定义的前提下,就被定义成一个值是0的 void* 类型的指针常量

空指针指向内存的什么地方
标准并没有对空指针指向内存中的什么地方这一问题作出规定,也就是说用哪个具体地址值表示空指针取决于系统实现。我们常见的空指针一般指向0地址,即空指针的内部用全0来表示(zero null pointer,零空指针);也有一些系统用一些特殊的地址值或者特殊的方式表示空指针(nonzero null pointer,非零空指针),

三、空值指针

void 类型指针是特殊类型的指针。在 c++ 中,void 表示没有任何类型,因此 void 指针指向的值是没有类型的(不确定的长度和值属性)。

这使得 void 类型指针的灵活性非常强,void 指针可以指向任意类型的数据,可以是整数,浮点数甚至字符串。

(1)任何类型的指针都可以直接赋值给void指针, 且无需进行强制类型转换。

任何类型指针都可以直接赋值给void指针

double obj = 3.14, *pd = &obj;
void* pv = &obj;        // 正确,void* 能存放任意类型对象的地址
                        // obj 可以是任意类型的对象
pv = pd;                // 正确,pv 可以存放任意类型的指针

(2)void指针并不能无需类型转换直接赋值给其他类型

如果要把 void 类型的指针赋值给其他类型的指针,需要进行显式转换。

double obj = 3.14, *pd = &obj;
void *pv = &obj;
	
double *pd1 = pv;               // 错误,不可以直接赋值
double *pd2 = (double*)pv;      // 必须进行显示类型转换
cout << *pd2 << endl;           // 3.14

(3)void指针可以直接和其他类型的指针进行比较指针存放的地址值是否相同

double obj = 3.14, *pd = &obj;
void *pv = &obj;
	
double *pd1 = pv;               // 错误,不可以直接赋值
double *pd2 = (double*)pv;      // 必须进行显示类型转换
cout << *pd2 << endl;           // 3.14
cout << (pv == pd2) << endl;    // 1

(4)void指针只有强制类型转换后才可以正常对其操作

概括来说,以 void* 的视角来看内存空间也就是仅仅是内存空间,没办法访问内存空间中所存的对象,因此只有对其进行恰当的类型转换之后才可以对其进行相应的访问。

也就是说一个 void 指针必须要经过强制类型转换以后才有意义。

double obj = 3.14, *pd = &obj;
void *pv = &obj;
	
cout << *(double*)pv << endl;   // 3.14

(5)void指针变量和普通指针一样可以通过 NULL 或 nullptr 来初始化,表示一个空指针

void *pv = 0; 
void *pv2 = NULL;
cout << pv << endl;         // 值为0x0
cout << pv2<< endl;         // 值为0x0

注意:不要混淆 空值 指针和 void 指针!一个空值指针是任何指针都能取到的值,表示指针不指向任何地方;一个 void 指针是一种指针类型,可以指向没有类型的值。一个代表存在指针中的值;一个代表指针指向值的类型。

四、如何删除指针

delete p; //先删除指针:释放了 p指向的内存空间,p此时指向的一个随机地址(野指针)
p=NULL //一定要加的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值