嘉鱼网站建设优化,谷歌推广外贸建站,免费海报制作网站,可以搜索国外网站的搜索引擎系列文章目录 C11新特性使用详解-持续更新 https://blog.csdn.net/xiaofeizai1116/category_12498334.html 文章目录 系列文章目录一、简介二、引入nullptr原因1. 消除歧义2. 兼容性问题3. 类型安全 三、使用场景1. 初始化指针变量2. 判断指针是否为空3. 释放内存后置为空 四、…系列文章目录 C11新特性使用详解-持续更新 https://blog.csdn.net/xiaofeizai1116/category_12498334.html 文章目录 系列文章目录一、简介二、引入nullptr原因1. 消除歧义2. 兼容性问题3. 类型安全 三、使用场景1. 初始化指针变量2. 判断指针是否为空3. 释放内存后置为空 四、总结 一、简介
C11引入了nullptr关键字它是一种空指针类型用于表示空指针。
二、引入nullptr原因
C11之前空指针一般用NULL宏或者0值表示为什么还有引入nullptr呢?
1. 消除歧义
NULL宏在不同的编译器环境中可能代表不同的值容易造成对空指针的理解混乱另外把0赋给指针也容易给人造成把整数常量赋给指针的误解。使用nullptr从语言层面解决了上述问题提高了代码的可读性。 Note NULL本质上是0在内存中表示不存在或没有指向任何对象的指针。如果一个指针被初始化为NULL意味着它目前不指向任何对象或数据。 2. 兼容性问题
不同平台对NULL的定义不同可能导致移植问题。相比之下因为nullptr是语言层面的关键字不会存在平台依赖性问题从而提高代码的可移植性。
3. 类型安全
nullptr是一个类型安全的空指针它明确地表示一个空指针不能转换成任何除void*以外的其他类型。避免了使用NULL时可能出现的类型转换问题。 Note NULL是一个宏不是关键字所以它不会被编译器检查类型。如果将其用于需要指针类型的地方编译器会将其视为0而不是一个指针类型。 /*
下面这段代码会运行时会崩溃原因如下
NULL是一个宏通常被定义为0或((void*)0)表示一个空指针。当我们将一个指针变量赋值为NULL时它表示这个指针变量不指向任何有效的内存地址。
在解引用一个指针时我们需要将指针所指向的内存地址中的值读取出来。在代码int x *p1中表示读取p1所指向的内存地址中的值。由于p1是一个int类型的指针编译器期望p1指向一个整数类型的内存地址。但是由于NULL是一个void*类型的值它不是一个整数类型的值当试图将一个void类型的值赋给一个int类型的变量时因为类型不匹配编译器会报错。
*/
int* p1 NULL;
int x *p1;/*
相比之下使用nullptr可以避免类型不匹配的问题。
nullptr是一个类型安全的空指针它明确地表示一个空指针。
编译器会检查使用nullptr的上下文确保它被正确地用于指针类型。在这段代码中p2被初始化为nullptr表示它是一个空指针。
由于p2被声明为int*类型编译器期望p2指向一个整数。然而由于p2是空的不能解引用它来获取一个整数值。编译器会报错避免了类型转换问题。
*/
int* p2 nullptr;
int x *p2; // 编译器会报错因为p是一个空指针三、使用场景
1. 初始化指针变量
用nullptr声明一个空指针变量
int* p nullptr; // 初始化一个整型指针变量p值为空指针在需要指针类型的地方编译器会根据上下文自动将nullptr转换为正确的指针类型
/*
在这个例子中我们调用func函数时传递了一个空指针作为参数。编译器会自动将nullptr转换为整数类型的指针并传递给func函数。
func函数在接收到空指针后就可以避免对无效的内存地址进行操作从而避免了潜在的错误。
*/
void func(int* p) { // ...
} int main() { func(nullptr); // 使用nullptr表示不传递任何有效的指针 return 0;
}2. 判断指针是否为空
int* p getPointFunc();
if (p ! nullptr) { // 如果p不为空指针则执行这里的代码
}3. 释放内存后置为空
int* p new int; // 动态分配内存
// 使用p指向的内存
delete p; // 释放内存
p nullptr; // 明确地将p设置为空指针四、总结
总的来说nullptr是以一种更安全、更清晰的方式来处理空指针。只要正确理解和合理使用它就能够帮助我们编写出质量更高、更容易维护的代码。