null_nullpointerexception - 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实习,看同事代码,总是写成xxx==null的模式,和自己原来的习惯不一样,后来百度了才知道,在极个别情况下xxx==null写成xxx=null不会报错,而null=xxx必然报错,更安全一些!
    java实习,看同事代码,总是写成xxx==null的模式,和自己原来的习惯不一样,后来百度了才知道,在极个别情况下xxx==null写成xxx=null不会报错,而null=xxx必然报错,更安全一些!
    
    展开全文
  • null放在前面就是为了避免变量为空时 引了空指针异常 如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法,当然会引发空指针异常了,但写成if(null==a)就不会了...
    null放在前面就是为了避免变量为空时 引了空指针异常
    如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法,当然会引发空指针异常了,但写成if(null==a)就不会了
    展开全文
  • 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 为空指针常量。是指针类型
    }
    

    转自

    展开全文
  • Java中对null进行判断放在前后没有什么区别,只是为了代码规范,为了避免写代码时书写错误。下面面两个测试Demo都没有报错。null放在前面是为了避免少写一个"=","null="书写会报错,防止笔误写...

    Java中对null进行判断放在前后没有什么区别,只是为了代码规范,为了避免写代码时书写错误。下面面两个测试Demo都没有报错。null放在前面是为了避免少写一个"=","null="书写会报错,防止笔误写成"=null"时检查不出来。

        @Test
        public void testDemo1(){
            String str = null;
            if (str==null){
                System.out.println("null在后");
                return;
            }
        }
    
        @Test
        public void testDemo2(){
            String str = null;
            if (null==str){
                System.out.println("null在前");
                return;
            }
        }

    为了防止笔误,也为了代码规范所以还是将null放在前面进行判断更好。

    展开全文
  • null != a 要比a != null 好在于避免由于编码失误造成把a赋值为null  只是编码风格上的区别,效率是一样的;  这个与equals是类似的。比如  String str = ..;  if(str.equals("admin"))  这样使用的...
  • 今天听到一个问题,java中的null类型,null竟然是一种类型 java语言中有两种类型,一种是基本类型,还有一种是引用类型。还有一个特殊的null类型即表达式null的类型,它没有名字。 因为null类型没有名字,所以不...
  • java中null+""输出的字符串仍是null,但是字符串形式的null,而且length是4个; “”+null 得到的结果是一个null字符串,采用字符串加上其它类型的参数时如过其它参数不是字符串类型,会被强制转换成字符...
  • null和“”的区别,null是空的,""并不是空
  • NULL

    2020-07-30 23:31:36
    NULL 博文链接:https://liubogod.iteye.com/blog/825964
  • java.util.ConcurrentModificationException: null at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) ~[na:1.8.0_171] at java.util.ArrayList$Itr.next(ArrayList.java:859) ~[...
  • Linux中的标准输入输出 标准输入0 从键盘获得输入 /proc/self/fd/0  标准输出1 输出到屏幕(即.../dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”  1、2>/dev/nu
  • 首先,区分空串和null串 1、 空串”“是长度为0的字符串,它有自己的串长度(0)和内容(空),判断一个字符串为空的方法: if (str.length() == 0); 或 if (str.equals("")); 2、 ...
  • /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
  • 今天工资中遇到问题 判断一个字段不为空的值 我用 字段 !=null 没有报错也没有数据,我以为真是...应该用,is not null 或 is null 还有 null 值和 ' ' 是有区别的 可以看这里点击打开链接 谢谢前辈的总结!!!...
  • java 空字符串与null区别 1、类型 null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ; ""表示的是一个空字符串,也就是说它的长度为0。例如声明一个字符串String str...
  • NULL 表示什么也不是,不能 =、&gt;、&lt; … 所有的判断,结果都是false,所有只能用 IS NULL 进行判断默认情况下,推荐使用 IS NOT NULL去判断,因为 SQL 默认情况下对 !=NULL 的判断会永远返回 0 行,但...
  • isNull, isNotNull与isEmpty, isNotEmpty区别在iBATIS中isNull用于判断参数是否为Null,isNotNull相反 isEmpty判断参数是否为Null或者空,满足其中一个条件则其true isNotEmpty相反,当参数既不
  • JAVA与SQL 中的nullNULL

    2018-08-22 09:42:04
     nullNULL不都是表示空值吗?这有什么值得深入讨论的的?首先你在编写Java代码时使用过NULL吗?大概用IDE用习惯了,自动给生成以及纠正没有注意过也很正常。同样道理在数据库中的疑问我就不提问了。如果你不了解...
1 2 3 4 5 ... 20
收藏数 5,547,736
精华内容 2,219,094
关键字:

null