(转)null和NULL和nullptr和””区别

突然想到这个有趣的问题:C语言和C++对大小写是敏感的,也就是说null和NULL是区别对待的。NULL代表空地址,null只是一个符号。便来深究,看了很多资料,总结如下:

其实null和NULL都是字符串(没啥区别,欢迎高手纠错!),具体看它们宏定义被定义成为什么值。

在VS中NULL被定义为0,因为习惯上把宏定义的所有字符都大写,当把NULL它赋值给指针时意思为空,当然你也可以把null定义为0了,都一样。

它们都没定义时都只能叫符号了,定义后就有另外的意思了,你把0直接赋值给指针也行,只要指针指向0就为空。

其实NULL在有些编译器中是赋为0了,这时你不能再去#define定义它了,否则就重定义了!

1,NULL

NULL的定义

[cpp]

#ifdef __cplusplus

#define NULL    0

#else

#define NULL    ((void *)0)

#endif

在C语言环境下,由于不存在函数重载等问题,直接将NULL定义为一个void*的指针就可以完美的解决一切问题。

但是在C++环境下情况就变得复杂起来,首先我们不能写这样的代码:

FILE* fp = (void*)0; //将void*直接赋值给一个指针是不合法的,编译器会报错。

我们只能这样写代码

[cpp]

FILE* fp = (FILE*)0;

// or

FILE* fp = 0;

/*

所以在C++中,NULL就被直接定义为一个整型0。在大多数情况下这并不会产生什么问题。但是万一有重载或者模板推导的时候,编译器就无法给出正确结果了。比如下面的情形:

[cpp] 

voidcall_back_process(CCObject* target, void* data);  

bind(call_back_process,target, NULL); // error 函数类型是void* ,但是我们绑定的是一个整型 0。

*/

2,nullptr

C++11,其中有一个是新的关键字nullptr

如果我们的编译器是支持nullptr的话,那么我们应该直接使用nullptr来替代NULL的宏定义。正常使用过程中他们是完全等价的。

模拟nullptr的实现:

某些编译器不支持c++11的新关键字nullptr,我们也可以模拟实现一个nullptr

[cpp]

const

class nullptr_t_t

{

public:

template<class T>          operator T*() const {return 0;}

template<class C, classT>  operator T C::*() const { return 0; }

private:

void operator& () const;

} nullptr_t = {};

#undef NULL

#define NULL nullptr_t

3,“”

“”也表示空,但是和null有很大区别:null没有分配空间,""分配了空间

String str1 = null;  //str引用为空

String str2 = "";  //str引用一个空串

也就是null没有分配空间,""分配了空间,因此str1还不是一个实例化的对象,而str2已经实例化。

注意:

因为null不是对象,""是对象。所以比较的时候必须是 if(str1==null){...}和if(str2.equals("")){...}。

对象用equals比较,null用等号比较。

因此,如果str1=null;下面的写法错误:

if(str1.equals("")||str1==null){//如果str1没有值,则.... }

正确的写法是

if(str1==null||str1.equals("")){//先判断是不是对象,如果是,再判断是不是空字符串}

打个比方:一个空玻璃杯,你不能说它里面什么都没有,因为里面有空气,当然也可以把它弄成真空,null与" "的区别就象真空与空气一样。

Thanks.

源博客地址:http://blog.csdn.net/cc1949/article/details/51249555

时间: 2024-08-25 07:55:07

(转)null和NULL和nullptr和””区别的相关文章

NULL、0、nullptr 区别分析

C的NULL 在C语言中,我们使用NULL表示空指针,也就是我们可以写如下代码: int *i = NULL; foo_t *f = NULL; 实际上在C语言中,NULL通常被定义为如下: #define NULL ((void *)0) 也就是说NULL实际上是一个void *的指针,然后吧void *指针赋值给int *和foo_t *的指针的时候,隐式转换成相应的类型.而如果换做一个C++编译器来编译的话是要出错的,因为C++是强类型的,void *是不能隐式转换成其他指针类型的,所以通

NULL和nullptr的区别

指定 std::nullptr_t 类型的 null 指针常量,该类型可转换为任何原始指针类型.尽管您可以使用关键字 nullptr 而不包含任何标头,但如果您的代码使用类型 std::nullptr_t,则您必须通过包含标头 <cstddef> 来定义该类型.请避免将 NULL 或零 (0) 用作 null 指针常量:nullptr 不仅不易被误用,并且在大多数情况下使用效果更好.例如,给定 func(std::pair<const char *, double>),那么调用 f

iOS 关于nil和Nil及null与&lt;null&gt;的区别

问题是这样的. NSDictionary *sample = [NSJSONSerialization JSONObjectWithData:received options:NSJSONReadingMutableLeaves error:&error]; NSString *messageInfo = [sample objectForKey:@"message"]; sample是一个字典,messsageInfo是从字典中根据key值取得的,然后通过log可以知道mes

C/C++语言中NULL、&#39;\0’和0的区别

注:本文参考了http://blog.csdn.net/mylinx/article/details/6873253及书籍<征服C指针>([日]前桥和弥著). NULL.'\0'和0的值是一样的,都是0,不过它们的表现形式不一样: 1. NULL: 即空指针,不过在C和C++中并不一样.在VS 2013的库文件string.h中可以看到如果定义. 1 /* Define NULL pointer value */ 2 #ifndef NULL 3 #ifdef __cplusplus 4 #d

remotepath != null 与 !TextUtils.isEmpty(remotepath) 的区别

remotepath != null   与 !TextUtils.isEmpty(remotepath) 的区别 !TextUtils.isEmpty(remotepath)    与   remotepath != null &&remotepath.length > 0   一样 或者初始化 remotepath = null,这时只判断 remotepath != null 也可以,如果初始化 remotepath = "" ,这时必须 用!TextUti

SQL中IS NOT NULL与!=NULL的区别

平时经常会遇到这两种写法:IS NOT NULL与!=NULL.也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合.实际上,是由于对二者使用区别理解不透彻. 默认情况下,推荐使用 IS NOT NULL去做条件判断,因为SQL默认情况下对WHERE XX!= Null的判断会永远返回0行,却不会提示语法错误. 这是为什么呢? SQL Server文档中对Null值的比较运算定义了两种规则,如在SQL Server 2000中: 规则一是是ANSISQL(SQL-92)规定的Null

赋值为0或null,和不赋值的区别

目录 赋值为0或null,和不赋值的区别 第一部分 第二部分 成员变量要是对象类型 静态变量是在什么时候赋值的 赋值为0或null,和不赋值的区别 第一部分 如果在方法中声明变量,声明时不赋值和给个null是不一样的,赋值null也相当于完成了初始化赋值,这个时候可以通过编译也可以可以调用对象方法,但必然会报空指针异常.但Java中成员变量不需要赋予初始值,但一般会有一个默认初值,基本类型如int初值为0,除基本类型变量外,其他对象的初始值都是null. 总之,一个局部对象使用之前肯定要先赋值,

mysql中NULL和null的区别

接触php的web开发一段时间了,在进行数据库操作的时候经常会遇到一个问题,使得同一字段在页面显示时有3种类型NULL,null以及数字,当时的解决办法是将这一字段定义为varchar类型,在插入数据时加引号,一直没有深入研究.今天问题又出现了,当插入的值为null时,页面显示是空的!仔细研究发现: 1.向数据表insert 'NULL'和'null'时,在数据表中显示的分别为NULL和空.   2.向数据表insert null时,在数据表中显示也为NULL.   3.从数据库select '

null,undefined,NaN的区别

一.null null表示尚未存在的对象,转为数值时为0.它表示"没有对象",即此处不该有值,常用来表示函数企图返回一个不存在的对象.null是一种特殊的object(引用类型),代表一个不确定的对象,但从null本身来说,它既不是对象,也不属于什么类型. typeof null //"object" typeof(null) //"object" null instanceof Object //false null //null ~null