NULL在C和C++中的定义

本文详细解释了C和C++语言中NULL宏的定义及其原因。在C中NULL被定义为(void*)0,以便能赋值给任意类型的指针;而在C++中,NULL被定义为0,以符合其严格的类型检查标准。

NULL在C/C++中是一个宏,定义为:

#if  !defined(NULL)
#ifdef __cplusplus
#define  NULL    0
#else
#define  NULL    ((void *)0)
#endif  // __cplusplus
#endif // NULL


请注意,在C中NULL定义为(void*)类型,是因为在c语言中void *数据可以赋值给各种类型的指针,而不进行类型检查。

所以在C语言中:

int * p=NULL;

才能够编译通过。

在C++中,NULL为数值0,不能定义成(void *),否则会出现编译错误。主要是因为C++对类型检查比较严格。

<think>好的,我现在需要回答用户关于C语言中的NULLC++中的nullptr区别的问题。首先,我应该回顾这两个概念的基本定义用途。 在C语言中,NULL通常被定义为一个宏,可能被替换成0或者((void*)0),用来表示空指针。而C++中的nullptr是一个关键字,专门用来表示空指针,类型是std::nullptr_t。关键点在于,C++引入nullptr是为了解决NULL在重载函数时可能引起的歧义问题。 接下来,我需要考虑用户可能的疑问:为什么C++要引入nullptr?比如,当有函数重载接受指针整型参数时,传递NULL可能会导致调用错误的函数,因为NULL可能被定义为0,编译器会优先选择整型版本。而nullptr则明确表示指针类型,避免了这种问题。 然后,我需要举一个例子来说明这种情况。例如,函数重载void func(int)void func(char*),当调用func(NULL)时,如果NULL是0,可能会调用到int版本,而使用nullptr则会调用指针版本。此外,类型安全方面,nullptr有明确的指针类型,而NULL可能被当作整数,这在模板推导或类型转换时会有不同的行为。 另外,C++11标准引入nullptr作为关键字,之前的版本可能仍然使用NULL,但推荐使用nullptr。同时,C中的NULLC++中的NULL可能有不同的实现,比如在C++NULL通常是0,而C可能允许((void*)0),但在C++中不允许将void*隐式转换为其他指针类型,所以C++中的NULL不能是((void*)0)。 最后,我需要总结两者的主要区别,包括类型安全性、重载解析、类型推导以及在模板中的应用。确保回答清晰,并且给出示例代码来演示问题。 现在,我需要检查是否有遗漏点,比如历史背景、类型转换的问题,以及在不同标准下的差异。确保解释足够详细,但不过于冗长。然后,按照用户的要求,提供相关问题,这些问题应该围绕NULLnullptr的区别、用途,以及C++中相关的指针处理机制展开。</think><< C语言中的`NULL`C++中的`nullptr`区别如下: 1. **类型不同**: - **C的`NULL`**: 通常定义为`(void*)0`或`0`,具体取决于编译器。例如,在C中可能直接使用`0`或强制转换为`void*`的指针。 - **C++的`nullptr`**: 是C++11引入的关键字,类型为`std::nullptr_t`,隐式转换为任意指针类型,但不会隐式转换为整型。 2. **类型安全**: - **`NULL`的问题**: 在C++中,若`NULL`被定义为`0`,传递到函数重载中可能导致歧义(例如同时存在`void func(int)``void func(char*)`时,`func(NULL)`可能调用`int`版本)。 - **`nullptr`的改进**: 明确表示空指针,避免类型推导错误。 3. **代码示例**: ```cpp // C++NULLnullptr的区别示例 #include <iostream> void func(int x) { std::cout << "int\n"; } void func(char* p) { std::cout << "pointer\n"; } int main() { func(0); // 输出 "int" func(NULL); // 可能编译报错(若NULL为0)或输出 "int" func(nullptr); // 明确调用指针版本,输出 "pointer" } ``` 4. **模板类型推导**: - 使用`nullptr`在模板中能正确推导指针类型,而`NULL`可能被推导为`int`。 **总结**: - `nullptr`是类型安全的空指针,专为解决C++中`NULL`的类型歧义问题引入。 - 在C++中优先使用`nullptr`,避免使用`NULL`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值