如何用好c++指针

c++最大的魅力在于指针,而最困扰c++新学者的也是指针。很多bug都是由于指针使用不当所引发的,下面总结使用指针时需要注意的几个关键点。

1.区分未初始化的指针和空指针

初学指针时,总是以为未初始化的指针就是空指针,这是一个很容易产生的误区。
不同的编译器可能对未初始化的变量的编译机制不同,同一段代码在不同的条件下运行可能会有不同的结果,这些不确定性因素阻碍了我们认清未初始化的变量,也阻碍了我们养成良好的编程习惯。

  • 未初始化指针

未初始化指针指向一个不明确的地址,编译器有可能已经为它赋空值,也有可能没有做任何干预。有的编译器可能允许未始化指针的存在,有的编译器可能不允许。这些不确定性很隐秘。了解这种不确定性后,我们才终于知道什么是一劳永益的办法,那就是指针能在声明时初始化就初始化,能早初始化就早初始化。不要吝啬写那个“=”号。明确的指针直接赋值,如果不明确指针的使用时机,一定要为指针赋空值。

以前总是用null, 给人一种不明就里的感觉,想判断一个指针是否为null时,总感觉它是null,可是它就是不能如我们所愿。有时候让用null,有时候又不让用null。总之一头雾水,难受至极。现在有了nullptr,看着是不是舒服很多。了解更多关于null、nullptr的区别

2.判断指针是否有效

如下这是我们惯用的方式,指针可以被隐式转为bool,0为false,不为0为true。很多时候这里很容易报错,原因是我们在这里不能对非法指针(未初始化指针和已删除的指针)进行判断。

if(ptr)
{
	//此处实现功能
}

所以,用这种形式判断时,我们必须保证我们的指针是安全的,即非空指针一定是有效的指针。所以在删除指针后,要养成将指针置空的良好习惯。

3.使用void*指针

当你使用过一次void* 指针后,就会发现它的强大之处,如果你还没有意识到它的存在,从现在开始使用它吧。如:一个函数运行完成后,可能需要返回的类型不确定,如函数可能返回struct A,也可能返回struct B。这时我们就需要使用void*来帮助我们解决这个问题。

4.delete[] 及char指针的删除

char* ptrc = new char[200000];
memcpy(ptrc, "word", 5);
delete ptrc;

经过测试,vs2013编译器完全释放了内存。或许这也是为什么要用高版本的开发工具的原因,编译器在不断的更新换代,变得更加能理解我们所要的结果,使得原本有问题的代码变得没有问题。所以对编程过程中的bug要辩证来看,有些bug的主要原因可能来自我们自身,而有些bug则是因为编译器还不够智能,不能准确理解语言所要表达的内容。但是如果我们改变不了编译器,那就改变自己。

5.常见的错误

6.技巧

  • 提取二进制流中的字符串

    byte data[] = {‘w’, ‘r’, ‘a’, ‘j’, 0x00,0x10,0x11};
    string str((char*)data);

  • 通过指针建立链表

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值