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: 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)就不会了...
  • 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类型没有名字,所以不...
  • js中当null值为字符串''null''的问题

    千次阅读 2018-11-09 09:45:16
    当通过url传参的时候 /choose_member.html?deptId='+sessionStorage.getItem('dept_Id'); 接收页面通过封装过的getQueryString()方法获取值 function getQueryString(name){ var reg = new RegExp("...am...
  • 关于null != a 与 a != null 的区别

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

    万次阅读 2018-11-01 19:46:32
    我们在开发的时候经常会判断一个null值,那么我们该如何去判断呢?这篇文章就教大家如何用js判断null值的方法,分别用两种方法来对比一下如何正确用js判断null值。 以下是不正确的方法: var exp=null; if(exp==...
  • MySQL 中NULL和空值的区别?

    万次阅读 多人点赞 2019-08-06 22:54:31
    作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值。那你知道它们有什么区别吗? 学不动了,也不想知道它们有什么区别。大兄弟,不行啊,要面试! 前些天我的好朋友小木...
  • spring 注解验证@NotNull等使用方法

    万次阅读 多人点赞 2018-11-13 11:39:22
    常用标签@Null 被注释的元素必须为null @NotNull 被注释的元素不能为null @AssertTrue 被注释的元素必须为true @AssertFalse 被注释的元素必须为false @Min(value) 被注释的元素必须是一个数字,其值必须大于等于...
  •  1.1 null与not null  null 和 not null是mysql的字段属性,或称为数据类型的属性,不属于任何类型。null值也不等同于空值,空值是不占用存储空间的,null占用存储空间,如对myisam表占用1bit额外存储空间。  1.2...
  • Oracle中null的使用详解

    千次阅读 2012-02-24 17:28:55
    最好不查找NULL,或is not null ,is null,更不能比较null值 问:什么是NULL? 答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零。 ORACLE允许...
  • is null 和 is not null 都不能利用 索引

    万次阅读 2015-02-03 14:17:27
    null 的列不能创建索引,还有资料说因为一般的索引是 b_ 树结构,而 b+ 树不能存储 null 值,所以 is null 和 is not null 都不能利用 索引。为了证明以上说法,我做了一下测试。 1. 测试含有 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,也就是标准输出...
  • NULL与唯一性约束

    万次阅读 2014-04-08 19:59:04
    NULL是个很特殊的东西,也容易引起一些问题。参看:http://blog.csdn.net/zedware/article/details/20488167。
  • 深入详解SQL中的Null

    千次阅读 2015-03-18 20:10:42
    NULL 在计算机和编程世界中表示的是未知,不确定。虽然中文翻译为 “空”, 但此空(null)非彼空(empty)。 Null表示的是一种未知状态,未来状态,比如小明兜里有多少钱我不清楚,但也不能肯定为0,这时在计算机中就使用...
1 2 3 4 5 ... 20
收藏数 6,345,719
精华内容 2,538,287
关键字:

null