zoukankan      html  css  js  c++  java
  • (转)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

  • 相关阅读:
    06 | x86架构:有了开放的架构,才能打造开放的营商环境
    02 | 学习路径:爬过这六个陡坡,你就能对Linux了如指掌
    01 | 入学测验:你究竟对Linux操作系统了解多少?
    String、StringBuffer与StringBuilder区别
    JavaSE语言基础之字符串
    JavaSE语言基础之数组及其排序
    JavaSE语言基础之流程控制语句
    JavaSE语言基础之数据类型
    Java开发环境配置
    shell 脚本 自增
  • 原文地址:https://www.cnblogs.com/happinessday/p/6369504.html
Copyright © 2011-2022 走看看