int *a) { cout<<__func__<<"int*"<<endl; } int main() { int *p =NULL;//(void*)0; int *q = nullptr ;//C++11的空指针定义 get(NULL); get(nullptr); // get((void*)0); } 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn
还有: void func(int); void func(char*); 如果NULL被定义为0,func(NULL)会去调用void func(int),这是不合理的 所以引入nullptr nullptr的类型为nullptr_t,能够隐式的转换为任何指针。 所以用空指针就尽可能的使用nullptr。
nullptr 整数用0, 实数用0.0, 指针用nullptr, 字符串用'\0'. 在标识地址(指针)的时候, C++11往后的项目用nullptr, C++0x项目则用NULL, 毕竟这看起来更像是指针. 因为在C++的基本观点上来看, 0的型别是int, 而非指针. 因此从long到int, 从long到bool, 还有从0L到void*的型别转换都是允许的. nullptr的优点在于, 它不具备整形型别. 事实上nullptr的型别是std::nullptr_t, 他可以隐式转换到所有的裸指针型别.
所以C++11引入了新的指针空值nullptr。很好的解决了上面出现的违背原意的操作。C++11把nullptr作为一个关键字引入。它本身是“指针空值类型”的一个常量。 指针空值常量类型被命名为nullptr_t。 cout << "int* f\n"; } void f(int a) { cout << "int f\n"; } int main(int argc, char** argv) { f(nullptr 但是需要注意的是nullptr的地址是不能被用户使用的。
io_win32.cc 报错行 94 template <typename char_type> bool null_or_empty(const char_type* s) { //TODO: nullptr error return (s == nullptr || *s == 0); } 函数本来要返回的是空指针但是却没有nullptr 在系统中空指针的值是0xCC(传说中的烫烫烫) 修改为0xCC 就好了 template <typename char_type> bool null_or_empty(const char_type* s) { //TODO: nullptr error
【代码规范】详解nullptr、NULL、0 最近一直搞不清楚 nullptr, NULL, '\0'这三者的真正区别,因为有的时候会发现,混用这三种用法,编译器也不会报错,在这里对相关的一些定义和使用方式进行整理 NULL 和 nullptr 根据上面,我们知道了NULL本身是符号,只是不同编译器给出了不同的定义。刚刚看到了vs的定义,下面看下gcc对NULL的定义: ? 为了解决这种二义性,nullptr应运而生,C++是强类型语言,又有模板、重载之类需要编译器“依类型随机应变”的东西,所以作为指针 型的0和整数类型的0就必须分开,不然会带来很多麻烦。 所以,和整数大家族相关,请用0(或自己重新定义的NULL,因为某些工程/实现可能把NULL定义成nullptr或者(void*) 0),和指针大家族相关,请用nullptr,这样才能写出尽量不出意外的程序 所以再次重复下,和整数大家族相关,请用0,和指针大家族相关,请用nullptr。
为了解决这个问题,C++11引入了新的空指针常量nullptr。nullptr是一个特殊的关键字,它的类型是std::nullptr_t,表示一个空指针常量。 使用nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,而不能被转换为整数类型。 注意: 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。 三、NULL与nullptr的区别 NULL和nullptr都是表示空指针的关键字,但是在C++11之后,推荐使用nullptr来表示空指针。 而nullptr是一个关键字,且严格遵循类型安全规则,只能转换为指针类型。 重载:nullptr可以进行函数重载,而NULL不可以。
2.1、nullptr的本质 C++11 引入的 空指针专用字面量,是一种特殊类型(std::nullptr_t),专门用于表示 “空指针”,解决了传统 NULL 的缺陷。 C++11 中引入 nullptr,nullptr 是一个特殊的关键字,nullptr 是一种特殊类型的字面量,它可以转换成任意其他类型的指针类型。 使用 nullptr 定义空指针可以避免类型转换的问题,因为 nullptr 只能被隐式地转换为指针类型,而不能被转换为整数类型。 不要将 nullptr 与整数直接比较(如 if (nullptr == 0) 编译报错),仅用于指针的空值判断: int* p = nullptr; if (p == nullptr) { ... } // 正确(判断指针为空) 若需兼容 C 语言代码(C 无 nullptr),可保留 NULL;纯 C++ 项目建议全面替换为 nullptr。
引入 nullptr 的主要原因包括以下几点: 1. 类型安全: nullptr 是一个特殊的空指针常量,它不属于整数类型,也不属于其他指针类型。 兼容性: 为了向后兼容,C++11 引入了 nullptr,并推荐在新代码中使用它而不是 NULL。在 C++17 中,标准推荐使用 nullptr 而非 NULL。 模板编程: 在模板编程中,特别是在模板元编程中,使用 nullptr 可以更好地处理空指针相关的逻辑,因为它有明确的类型。在模板中,传递 nullptr 可以更好地匹配相应的模板参数。 auto myAutoPointer = nullptr; // 推导为 std::nullptr_t 类型 if (myAutoPointer == nullptr) { / nullptr 更现代、类型安全 9.
*p2 = 0;int *p3 = nullptr;新标准中建议使用nullptr代替NULL来声明空指针。 nullptr关键字真是为了解决这个问题而引入的。另外我们还有注意到NULL只是一个宏定义,而nullptr是一个C++关键字。 nullptr如何使用nullptr关键字用于标识空指针,是std::nullptr_t类型的(constexpr)变量。 char *p1 = nullptr; // 正确int *p2 = nullptr; // 正确bool b = nullptr; // 正确. if(b)判断为falseint a = nullptr; // error
然而,NULL在C++中有一些问题和限制,这就是C++11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。1. 2. nullptr的引入为了解决上述问题,C++11引入了nullptr。nullptr是一种特殊类型的指针,称为nullptr_t。它可以被转换为任何其他类型的指针,但不能被转换为整数类型。 3. nullptr的优点nullptr不仅解决了NULL的问题,还有其他一些优点:更安全:nullptr只能被转换为其他指针类型,不能被误用为整数。 更清晰:nullptr明确表示一个空指针,比NULL更易于理解。4. nullptr的使用nullptr的使用非常简单。 你可以像使用NULL一样使用nullptr:int* p1 = nullptr;char* p2 = nullptr;你也可以在函数中使用nullptr来检查空指针:void foo(char* p)
= nullptr在编程中,我们经常会遇到各种错误和异常。其中一种常见的错误是“Expression: public_stream != nullptr”。 正确初始化指针变量确保在使用指针变量之前,为其分配合适的内存空间,并将其初始化为nullptr。 在这种情况下,需要确保在使用指针之前重新分配合适的内存空间,并将其初始化为nullptr。 例如:cppCopy codepublic_stream = nullptr; // 确保指针变为nullptr,避免悬挂指针的问题// 重新分配内存空间和初始化指针这样可以避免使用无效的指针,从而避免出现该错误 = nullptr"时,我们通过不同的方法来确保public_stream指针的有效性。
std::cout << "ptr is nullptr" << std::endl; } return 0;}在上述代码中,ptr被初始化为nullptr,通过ptr == nullptr 四、nullptr的应用场景4.1 初始化指针可以使用nullptr来初始化指针,明确表示该指针为空。 五、nullptr与NULL、0的对比5.1 类型方面表示方式类型nullptrstd::nullptr_tNULL通常为整数0(C++中)0整数nullptr具有明确的类型std::nullptr_t 例如:六、nullptr的优势6.1 类型安全nullptr具有明确的类型std::nullptr_t,只能被隐式转换为指针类型,而不能被转换为整数类型,这有效避免了类型不匹配的问题。 例如,不要将nullptr与NULL或0进行比较,因为它们的语义和类型不同。直接使用ptr == nullptr或ptr != nullptr来判断指针是否为空即可。
// 有call Add语句就是没有展开,没有就是展开了 int ret = Add(1, 2); cout << Add(1, 2) * 5 << endl; return 0; } nullptr • C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型。 使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,⽽不能被转换为整数类型。 f(NULL); f((int*)NULL); // 编译报错:error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型 // f((void*)NULL); f(nullptr
注意: 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的 在C++11中,sizeof(nullptr) 与 sizeof((void)0)所占的字节数相同 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr
特性 auto关键字(C++11) 1.auto的简单介绍 2.auto使用规则 3 auto不能推导的场景 基于范围的for循环(C++11) 1 范围for的语法 2.范围for的使用条件 指针空值nullptr ---- 指针空值nullptr(C++11) 1.C++98中的指针空值 在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。 注意: 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是++11作为新关键字引入的。 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。 < "f(int)" << endl; } void f(int*) { cout << "f(int*)" << endl; } int main() { f(0); f(NULL); f(nullptr
nullptr nullptr并非整型类别,甚至也不是指针类型,但是能转换成任意指针类型。nullptr的实际类型是std:nullptr_t。 博客:https://www.yanbinghu.com/2019/08/25/36794.html 为什么该使用nullptr 回到最开始的问题,为什么作为指针的语义,我们应该使用nullptr,而不是 但是如果我们使用nullptr却不会: test(nullptr); 除了这点之外,在C++模板中它还有更好的表现。 但是如果我们用nullptr就不会有上面的问题。 总结 如果你想表示空指针,那么使用nullptr,而不是NULL。 注:nullptr在C++ 11中才出现。
C++11中引入nullptr是为了解决NULL的二义性问题。 使用nullptr(空指针常量),当函数调用func(nullptr)时则会调用func(int *)函数。
问题 C++11 中的 nullptr 到底是什么?. 为了解决上述重载函数所带来的问题,C++11 的 nullptr 应运而生。 = {}; nullptr 只是一个常量,这就意味着我们可以在程序中随意定义一个与其名称相同的标识符,但因为 nullptr 在实际编程中的应用实在太广泛,因此 C++ 编译器一般都会把 nullptr 在 C++ 语言编程中,请使用 nullptr。 既为了避免以后出现 bug,也为了养成一个良好的编程习惯。 参考文献: http://www.stroustrup.com/N1488-nullptr.pdf
二、nullptr的特点 1.类型安全 nullptr的类型是std::nullptr_t,这是一个特殊的类型,专门用于表示空指针。 3.函数重载支持 nullptr可以与函数重载一起使用,特别是当涉及到指针和整数类型的重载时,nullptr可以明确指定调用哪个版本的函数。 三、nullptr的用法 1.初始化指针 使用nullptr初始化指针是一种常见的做法,它明确表示该指针不指向任何有效的内存地址。 int* ptr = nullptr; 2.函数参数和返回值 在函数参数和返回值中,nullptr用于表示空指针或无结果的情况。 std::unique_ptr<int> uptr = nullptr; std::shared_ptr<int> sptr = nullptr; 4.模板代码中的使用 在模板代码中,nullptr