C++中关于指针初始化和使用NULL的理解

1、严禁使用未被初始化的指针:C++创建指针的时候,只分配存储地址的内存,并不会分配存储数据的内存,所以指针可能指向任何位置。

   (1)使用解除运算符(*)之前,一定要对指针初始化,否则若声明的指针刚好指向程序代码的位置会导致一些很隐蔽的错误。

   (2)未被初始化之前禁止指针之间的赋值。

例如:

#include "stdafx.h"
#include <iostream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    int *p,*q;
    p=q;
    return 0;
}

或者

#include "stdafx.h"
#include <iostream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    int *p,*q;
    *p=100;
    return 0;
}

在vs中会提示相应的问题

2、对NULL的理解

一开始想不明白:如果给一个指针初始化成NULL之后不是就代表,指针指向一块内存单元了吗,那应该可以直接往里面填值,可是实际却不可以。

程序如下:

#include "stdafx.h"
#include <iostream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    int *p;
    p=NULL;
    *p=100;
    return 0;
}

首先看一下百科中一段关于NULL的描述:

NULL的出现是一种约定俗成,事实上它不是C语言中的关键字;把一个指针赋值为NULL,通常的说法是“将指针悬空”。这样,指针就无法再进行任何数据访问了。编程工作中有一类比较容易犯的错误--指针地址未进行正确的更新赋值就加以使用,这往往会造成很严重的后果(对内存区进行错误的涂抹)。所以一个良好的习惯是,当一个指针的工作稍事休息,先把它赋值为NULL,待到再度使用时,重新对其赋值以及进行指针类型转化。

前面说到“NULL指针无法再进行任何数据访问”,其实是视编译器功能而定的。0位置指向的是程序起始,对于不同的编译器,NULL指针的操作结果是不同的:有些是不准读写,有些是只读,甚至读写都允许。编译器是人定的。引用网友win_hate在话题“关于NULL的不严谨”中的话来说:“如果说有谁不严谨了,那必定是读取0位置的程序员,而不是C。

也就是说将指针赋值成NULL有些编译器是不能往里边填值的,所以要使用new来分配一段合适的内存才可以填值,而且使用new申请的内存还可以使用delete进行配对删除,可以防止内存泄露。

所以NULL就像安全带,将指针悬空,避免程序员因为大意而犯下一些不必要的错误。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏happyJared

设计模式入门:简单工厂模式

  简单工厂是一种创建型模式。根据开闭原则推导,在简单工厂模式应用中新增功能,需要添加相应的子类(对扩展开放,但同时也对修改开放了),并修改核心工厂类的相应方法...

1352
来自专栏python小白到大牛

这里是最全面的 python 字符串拼接总结,赶快收藏!

在 Python 中字符串连接有多种方式,这里简单做个总结,应该是比较全面的了,方便以后查阅。

1733
来自专栏编程

程序员C语言C加加新手小白入门基础最容易犯的17种错误,你中了几个?

相信这么努力的你 已经置顶了我 C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考...

2315
来自专栏TungHsu

这或许是对小白最友好的python入门了吧——3,数字处理

昨天那篇推文是不是太长了,以后为了大家能够更好地理解,所以我们还是写的少点,大家看完以后要好好练习哦! 不要在此处直接复制代码! 在Python中可以执行对整...

3126
来自专栏深度学习之tensorflow实战篇

Python中的__init__()方法整理中(两种解释)

解释一:看懂了就不用看第二种了 __init__()方法是Python学习当中重要的基础知识,__init__()方法意义重大的原因有两个。第一个原因是在对...

9886
来自专栏北京马哥教育

深入 Python 字典的内部实现

字典是通过键(key)索引的,因此,字典也可视作彼此关联的两个数组。下面我们尝试向字典中添加3个键/值(key/value)对: 这些值可通过如下方法访问: 由...

36815
来自专栏大前端开发

ES6特性之:let和const

ES6之前,我们只有一种声明变量的方式:var,不能声明常量,如果我们有一些不变的值,比如一些固定的错误代码,我们可能会这样去声明,把它们当做常量来使用:

966
来自专栏java思维导图

你真的懂Java中的String、StringBuilder和StringBuffer吗?

相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String、StringBui...

1332
来自专栏北京马哥教育

grep、egrep正则表达式之初窥门径

何谓正则表达式 正则表达式,又称正规表示法、常规表示法 (Regular Expression,在代码中常简写为regex、regexp或RE),是一类字符所...

2158
来自专栏zingpLiu

python基础(一)

  python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚...

2352

扫码关注云+社区

领取腾讯云代金券