C++空指针NULL和nullptr

简介: 🐰C++空指针NULL和nullptr 🏡空指针

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰C++空指针NULL和nullptr

🏡空指针


🐰C++空指针NULL和nullptr

🏡空指针

C++指针类型有一个特殊的值,称之为“空指针”

在标准C中,0带有常数及空指针的双重身份。通常,0更容易被理解为值0的整型常量,用它表示空指针不太容易理解,所以程序员也会选择使用宏NULL来表示空指针

1. #undef NULL
2. #if defined __cplusplus
3. #define NULL ((void *)0)
4. #else
5. #define NULL 0
6. #endif

在C语言环境下,由于不存在函数重载的问题,直接将NULL定义为一个void*的指针就可以完美的解决问题。但是,在C++环境中情况变得复杂起来了,由于C++不采用C的规则,不允许将void* 隐式转换为其他指针。为了使cahr* c=NULL;能通过编译,NULL只能定义为0.

例如:

1. #include<iostream>
2. using namespace std;
3. int main()
4. {
5.     char* c=NULL;
6.     c="hello C++!";//如果NULL还是void*,这里将编译错误,因为在C++环境中不允许隐式转换为其他指针,而"hello C++!"又需要字符指针指向它,而此时的c是void*的类型。所以编译会出错,为了使编译通过NULL只能定义为0
7.     return 0;
8. }

这里还可以验证NULL的类型在C++中,因为C++支持函数重载。

例如:

1. #include<iostream>
2. using namespace std;
3. void f1(void* v)
4. {
5.     cout<<"this is void*"<<endl;
6. }
7. void f1(int n)
8. {
9.     cout<<"this is int"<<endl;
10. }
11. int main()
12. {
13.     f1(NULL);
14.     return 0;
15. }
16. 结果:编译失败
17. 存在二义性

C++11引入了新的关键字来代表空指针常数:nullptr,将空指针和整数0的概念区分开。nullptr的类型为nullptr_t,能隐式转换为任何指针类型(包括成员函数指针和成员变量指针)和bool类型。

例如:

1. #include<iostream>
2. using namespace std;
3. void f1(nullptr_t t)
4. {
5.     cout<<"this is nullptr_t"<<endl;
6. }
7. void f1(void* )
8. {
9.     cout<<"this is void*"<<endl;
10. }
11. void f1(int n)
12. {
13.     cout<<"this is int"<<endl;
14. }
15. int main()
16. {
17.     f1(nullptr);
18.     return 0;
19. }
20. 结果:
21. this is nullptr_t

注意:nullptr不能隐式转换为整数,也不能和整数比较

如果编译支持nullptr,建议使用nullptr,增加代码的健壮性

空指针到底指向内存的什么位置?是地址为0的内存单元还是内存中的一个特殊区域或是其他地方,在C++的标准中并没有明确规定。我觉得如果一个指针被赋予空指针,应该就相当于这个指针执行了0x0000这个逻辑地址,但是0x0000这个逻辑地址用户是不能使用的。

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  

相关文章
|
16天前
|
C++
C++(十八)Smart Pointer 智能指针简介
智能指针是C++中用于管理动态分配内存的一种机制,通过自动释放不再使用的内存来防止内存泄漏。`auto_ptr`是早期的一种实现,但已被`shared_ptr`和`weak_ptr`取代。这些智能指针基于RAII(Resource Acquisition Is Initialization)原则,即资源获取即初始化。RAII确保对象在其生命周期结束时自动释放资源。通过重载`*`和`-&gt;`运算符,可以方便地访问和操作智能指针所指向的对象。
|
16天前
|
C++
C++(九)this指针
`this`指针是系统在创建对象时默认生成的,用于指向当前对象,便于使用。其特性包括:指向当前对象,适用于所有成员函数但不适用于初始化列表;作为隐含参数传递,不影响对象大小;类型为`ClassName* const`,指向不可变。`this`的作用在于避免参数与成员变量重名,并支持多重串联调用。例如,在`Stu`类中,通过`this-&gt;name`和`this-&gt;age`明确区分局部变量与成员变量,同时支持链式调用如`s.growUp().growUp()`。
|
29天前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
23 1
|
1月前
|
安全 NoSQL Redis
C++新特性-智能指针
C++新特性-智能指针
|
1月前
|
编译器 C++
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
|
1月前
|
存储 C++
c++学习笔记06 指针
C++指针的详细学习笔记06,涵盖了指针的定义、使用、内存占用、空指针和野指针的概念,以及指针与数组、函数的关系和使用技巧。
29 0
|
1月前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针
|
1月前
|
C++
C++通过文件指针获取文件大小
C++通过文件指针获取文件大小
24 0
|
1月前
|
编译器 C语言 C++
【C++关键字】指针空值nullptr(C++11)
【C++关键字】指针空值nullptr(C++11)
|
11天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。