null_nullptr - CSDN
精华内容
参与话题
  • NULL和0的区别

    千次阅读 2017-06-26 00:27:16
    一、什么是空指针常量(null pointer constant)? [6.3.2.3-3] An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant. 这里告诉我们...

    一、什么是空指针常量(null pointer constant)?

    [6.3.2.3-3] An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.

    这里告诉我们:00L'\0'3 - 30 * 17 (它们都是“integer constant expression”)以及 (void*)0等都是空指针常量(注意 (char*)0 不叫空指针常量,只是一个空指针值)。

    至于系统选取哪种形式作为空指针常量使用,则是实现相关的。一般的 C 系统选择(void*)0或者0的居多(也有个别的选择0L);

    至于 C++ 系统,由于存在严格的类型转化的要求,void*不能象C 中那样自由转换为其它指针类型,所以通常选0作为空指针常量(tyc: C++标准推荐),而不选择(void*)0

    二、什么是空指针(null pointer)?

    [6.3.2.3-3] If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

    因此,如果p是一个指针变量,则 p = 0;p = 0L;p = '\0';p = 3 - 3;p = 0 * 17; 中的任何一种赋值操作之后(对于 C 来说还可以是 p = (void*)0;), p 都成为一个空指针,==由系统保证空指针不指向任何实际的对象或者函数==。反过来说,任何对象或者函数的地址都不可能是空指针。(tyc: 比如这里的(void*)0就是一个空指针。把它理解为null pointer还是null pointer constant会有微秒的不同,当然也不是紧要了)

    ==wcy:也就是说把一个空指针常量赋值给一个指针后该指针就是一个空指针?==

    三、什么是 NULL?

    [6.3.2.3-Footnote] The macro NULL is defined in

    四、空指针(null pointer)指向了内存的什么地方(空指针的内部实现)?

    标准并没有对空指针指向内存中的什么地方这一个问题作出规定,也就是说用哪个具体的地址值(0x0 地址还是某一特定地址)表示空指针取决于系统的实现。我们常见的空指针一般指向 0 地址,即空指针的内部用全 0 来表示(zero null pointer,零空指针);也有一些系统用一些特殊的地址值或者特殊的方式表示空指针(nonzero null pointer,非零空指针),具体请参见C FAQ。

    幸运的是,在实际编程中不需要了解在我们的系统上空指针到底是一个 zero null pointer 还是 nonzero null pointer,我们只需要了解一个指针是否是空指针就可以了——编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。注意:不要把空指针的内部表示等同于整数 0 的对象表示——如上所述,有时它们是不同的。

    五、如何判断一个指针是否是一个空指针?

    这可以通过与空指针常量或者其它的空指针的比较来实现(注意与空指针的内部表示无关)。例如,假设 p 是一个指针变量,q 是一个同类型的空指针,要检查 p 是否是一个空指针,可以采用下列任意形式之一——它们在实现的功能上都是等价的,所不同的只是风格的差别。

    指针变量 p 是空指针的判断:

    if ( p == 0 )
    if ( p == '\0' )
    if ( p == 3 - 3 )
    if ( p == NULL )  /* 使用 NULL 必须包含相应的标准库的头文件 */
    if ( NULL == p )
    if ( !p )
    if ( p == q )
    ...

    指针变量 p 不是空指针的判断:

    if ( p != 0 )
    if ( p != '\0' )
    if ( p != 3 - 3 )
    if ( p != NULL )  /* 使用 NULL 必须包含相应的标准库的头文件 */
    if ( NULL != p )
    if ( p )
    if ( p != q )
    ...

    六、可以用 memset 函数来得到一个空指针吗?

    这个问题等同于:如果 p 是一个指针变量,那么
    memset( &p, 0, sizeof(p) );p = 0;
    是等价的吗?

    答案是否定的,虽然在大多数系统上是等价的,==但是因为有的系统存在着“非零空指针” (nonzero null pointer==),所以这时两者不等价。

    由于这个原因,要注意当想将指针设置为空指针的时候不应该使用 memset,而应该用空指针常量或空指针对指针变量赋值或者初始化的方法。

    七、可以定义自己的 NULL 的实现吗?兼答”NULL 的值可以是 1、2、3 等值吗?”类似问题

    [7.1.3-2] If the program declares or defines an identifier in a context in which it is reserved (other than as allowed by 7.1.4), or defines a reserved identifier as a macro name, the behavior is undefined.

    NULL 是标准库中的一个符合上述条件的 reserved identifier (保留标识符)。所以,如果包含了相应的标准头文件而引入了 NULL 的话,则再在程序中重新定义 NULL 为不同的内容是非法的,其行为是未定义的。也就是说,如果是符合标准的程序,其 NULL 的值只能是 0,不可能是除 0 之外的其它值,比如 1、2、3 等。

    八、malloc 函数在分配内存失败时返回 0 还是 NULL?

    malloc 函数是标准 C 规定的库函数。在标准中明确规定了在其内存分配失败时返回的是一个 “null pointer”(空指针):

    [7.20.3-1] If the space cannot be allocated, a null pointer is returned.

    对于空指针值,一般的文档(比如 man)中倾向于用 NULL 表示,而没有直接说成 0。但是我们应该清楚:对于指针类型来说,返回 NULL 和 返回 0 是完全等价的,因为 NULL 和 0 都表示 “null pointer”(空指针)。(tyc:一般系统中手册中都返回NULL,那我们就用NULL吧)

    展开全文
  • Java: null是什么??

    千次阅读 2019-05-02 20:01:17
    null是什么? 在学习过对象的实例化之后, 我们知道对象的实例化就是为对象的创建开辟存储空间。 对于一条实例化语句:Student stu=new Student(); //语句1 先是声明一个名为stu的Student类型变量,然后利用new...

    null是什么?


     在学习过对象的实例化之后, 我们知道对象的实例化就是为对象的创建开辟存储空间。

    对于一条实例化语句:
    Student stu=new Student();    //语句1
    先是声明一个名为stu的Student类型变量,然后利用new关键字为其创建实例。

    与下面的语句相比较:
    Student stu;                            //语句2
    语句2是声明一个类型为Student 的变量stu,从表述习惯上讲stu 是实例变量,但实际上此时stu并未成为一个真正的实例,它仅仅只是一个变量名字。

    stu= new Student();                //语句3
    语句3的执行结果就使得stu真正成为了一个Student实例,它指向了内存中的某块地址空间。
    语句1是一步到位,定义了一个实例变量并同时赋值。

    1.对于null的理解
           为了明确地表示那些仅有名字而没有实例空间的变量的具体内容,Java引入了关键字null, null 就是表示“空”的意思,是绝对意义上的空,这个空指的是不存在的意思。为了更好地理解null是什么,这里举个例子:
            有个准备进人施工阶段的楼字建筑项目,设计图纸已经确定了,建筑设计师们正在讨论某间单元的装修效果时,该单元的房号已经命名,假设为A901,此时,A901就是null的,它相当于上面写的语句2(一个名为stu的Student),这里它只是一个名为A901的房屋单元。

          而当该楼字项目已经施工完毕的时候,则A901就地在它所处的位置上真正地占有了一块物理空间,此时它就是非null(非空)了,也就是说它拥有了一块实例化的空间。就算这间房屋里头没有摆放东西,它也是存在的。我们千万不能将日常表达语“一间空的房问”等同于Java语言中的"房间为空”。

        在Java中,假设房间类为Room,则:
        Room room=null; //房间为空,房间room只是一个名字,实际不存在。
        Room room= new Room(); //一间空的房间,这间房里没东西。
     

       null就是空,抽象意义上的空,空就是无的概念。

        对于null的理解,应该是这样的:仅有一个变量名,但实际上不存在。

      2. null的作用
       (1)  判断一个对象实例是否null,

             用if(obj= = null){}来判断。
       (2)  释放内存,让一个非null的实例变量赋值为null,这样这个实例指针引用就被释放了,等待JVM回收其对应的内存垃圾。

     3.使用null时要注意的问题
       (1)  null是关键字,是大小写敏感的,不能将null写成Null或NULL.

       (2)  null用来标识一个空的对象,因此不能将null赋给基本型的变量。比如:
              String s= null; //正确
              int i=null; //错误,应修正为"int i=0;"char c= null; //错误

       (3)  对于一个值为null 的对象,如果你试图去访问其成员,则会触发空指针异常(NullPointerException)。
       (4)  用instancaeof(判断对象是否属于某种类型)去操作null对象,会返回false.

             如:有语句: String s= null;
             则“s instanceof String”的结果是false。

       (5)  可以使==或着!=操作来比较null值,但是不能使用其他算法或者逻辑操作,例如<或者>。

              在Java中,null ==null将返回true。

    展开全文
  • null和“”的区别,null是空的,""并不是空
    null和“”的区别,null是空的,""并不是空
    展开全文
  • nullptr和NULL

    万次阅读 2019-07-17 10:14:44
    NULL是一个宏定义,在c和c++中的定义不同,c中NULL为(void*)0,而c++中NULL为整数0 //C语言中NULL定义 #define NULL (void*)0 //c语言中NULL为void类型的指针,但允许将NULL定义为0 //c++中...

    nullptr是c++11中的关键字,表示空指针

    要区分nullptr和NULL,首先要明白NULL的含义:

    NULL是一个宏定义,在c和c++中的定义不同,c中NULL为(void*)0,而c++中NULL为整数0

    //C语言中NULL定义
    #define NULL (void*)0                //c语言中NULL为void类型的指针,但允许将NULL定义为0
    
    //c++中NULL的定义
    #ifndef NULL
    #ifdef _cpluscplus                       //用于判定是c++类型还是c类型,详情看上一篇blog
    #define NULL 0                         //c++中将NULL定义为整数0
    #else
    #define NULL ((void*)0)             //c语言中NULL为void类型的指针
    #endif
    #endif
    

    所以在c++中int *p=NULL; 实际表示将指针P的值赋为0,而c++中当一个指针的值为0时,认为指针为空指针

    然后理解nullptr:

    nullptr是一个字面值常量,类型为std::nullptr_t,空指针常数可以转换为任意类型的指针类型。

    在c++中(void *)不能转化为任意类型的指针,即 int p=(void)是错误的,但int *p=nullptr是正确的,原因

    对于函数重载:若c++中 (void *)支持任意类型转换,函数重载时将出现问题下列代码中fun(NULL)将不能判断调用哪个函数

    void fun(int i){cout<<"1";};
    void fun(char *p){cout<<"2";};
    int main()
    {
    fun(NULL);  //输出1,c++中NULL为整数0
    fun(nullptr);//输出2,nullptr 为空指针常量。是指针类型
    }
    

    转自

    展开全文
  • NULL

    2020-07-30 23:31:36
    NULL 博文链接:https://liubogod.iteye.com/blog/825964
  • null == undefined ?

    千次阅读 2017-08-19 10:56:34
    最近在看《JavaScript高级程序设计》一书,书中讲到相等操作符(==)时说,要比较相等性之前,不能将 null 和 undefined 转换成其他任何值,但要记住 null == undefined 会返回 true 。的确,在ECMAScript
  • 判断nullnull在前面与后面的区别

    万次阅读 2018-04-26 20:18:49
    null放在前面就是为了避免变量为空时 引了空指针异常 如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法,当然会引发空指针异常了,但写成if(null==a)就不会了...
  • undefined == null的正确解释

    万次阅读 2018-08-31 09:38:37
    console.log( undefined == null ) //true 有文章对此进行了解释,大致是下面的意思:undefined的布尔值是false,null的布尔值也是false,所以它们在比较时都转化为了false,所以 undefined == null 。 好吧,上面...
  • java中null+""和null+null的深入理解

    千次阅读 2018-09-21 09:43:00
    java中null+""输出的字符串仍是null,但是字符串形式的null,而且length是4个; “”+null 得到的结果是一个null字符串,采用字符串加上其它类型的参数时如过其它参数不是字符串类型,会被强制转换成字符...
  • java中的null类型---有关null的9件事

    万次阅读 多人点赞 2018-05-03 19:32:57
    今天听到一个问题,java中的null类型,null竟然是一种类型 java语言中有两种类型,一种是基本类型,还有一种是引用类型。还有一个特殊的null类型即表达式null的类型,它没有名字。 因为null类型没有名字,所以不...
  • 关于null != a 与 a != null 的区别

    万次阅读 2018-08-10 13:59:40
    null != a 要比a != null 好在于避免由于编码失误造成把a赋值为null  只是编码风格上的区别,效率是一样的;  这个与equals是类似的。比如  String str = ..;  if(str.equals("admin"))  这样使用的...
  • C++中NULL和nullptr的区别

    万次阅读 多人点赞 2018-11-22 20:49:28
    在编写C程序的时候只看到过NULL,而在C++的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有二义性的问题,为了弄明白这个问题,我...
  • 2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null

    万次阅读 2017-11-23 13:26:01
    Linux中的标准输入输出 标准输入0 从键盘获得输入 /proc/self/fd/0  标准输出1 输出到屏幕(即.../dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”  1、2>/dev/nu
  • java判断字符串不为空和null的方法

    万次阅读 多人点赞 2020-09-01 14:22:53
    首先,区分空串和null串 1、 空串”“是长度为0的字符串,它有自己的串长度(0)和内容(空),判断一个字符串为空的方法: if (str.length() == 0); 或 if (str.equals("")); 2、 ...
  • IOS开发中(null)与<null>的处理

    万次阅读 多人点赞 2014-07-31 13:33:40
    不小心在开发过程中,得到了(null)以及的返回值,找了好长时间只找到了一个关于的。 由于要根据返回值进行判断,做出必要反应,因此必须知道返回值所代表的具体字符,在得到(null)后利用isEqual:和@“”,NULL,...
  • 2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null的区别

    万次阅读 多人点赞 2019-05-24 17:05:08
    /dev/null 意思就是把错误输出到“黑洞” >/dev/null 2>&1 默认情况是1,也就是等同于1>/dev/null 2>&1。意思就是把标准输出重定向到“黑洞”,还把错误输出2重定向到标准输出1,也就是标准输出...
  • 2.找到里面username是null的行 SELECT * FROM usergrade WHERE ISNULL(USERNAME) SELECT * FROM usergrade WHERE USERNAME IS NULL 3.找到里面username不是null的行 SELECT * FROM usergrad
  • mysql 字段 is not null 和 字段 !=null

    万次阅读 2018-03-08 14:46:34
    今天工资中遇到问题 判断一个字段不为空的值 我用 字段 !=null 没有报错也没有数据,我以为真是...应该用,is not null 或 is null 还有 null 值和 ' ' 是有区别的 可以看这里点击打开链接 谢谢前辈的总结!!!...
  • 最近在解决问题时候发现,BeanUtils copyProperties 方法会将值为null的字段也进行复制, 这有时候会不能满足我们的需求,所以为了解决复制null问题, 小编对该方法就行了重写。 其中重要的代码就是加入null判断,...
  • MySQL IS NOT NULL、!=NULL、ISNULL() 详解

    万次阅读 2018-03-25 11:20:53
    NULL 表示什么也不是,不能 =、&gt;、&lt; … 所有的判断,结果都是false,所有只能用 IS NULL 进行判断默认情况下,推荐使用 IS NOT NULL去判断,因为 SQL 默认情况下对 !=NULL 的判断会永远返回 0 行,但...
1 2 3 4 5 ... 20
收藏数 5,629,312
精华内容 2,251,724
关键字:

null