精华内容
下载资源
问答
  • NULL和0的区别

    2017-08-16 09:23:12
    NULL和0的区别

    NULL和0的区别

    在C语言中,NULL和0的值都是一样的,但是为了目的和用途及容易识别的原因,NULL用于指针和对象,0用于数值。

    对于字符串的结尾,使用’\0’,它的值也是0,但是让人一看就知道这是字符串的结尾,不是指针,也不是普通的数值。

    在不同的系统中,NULL并非总是和0等同,NULL仅仅代表空值,也就是指向一个不被使用的地址,在大多数系统中,都将0作为不被使用的地址,所以就有了类似这样的定义。


    空指针常量

    0、0L、’\0’、3 - 3、0 * 17 以及 (void*)0 等都是空指针常量(注意 (char*) 0 不叫空指针常量,只是一个空指针值)。


    空指针

    char *p=0;此时p就是一个空指针,不指向任何实际对象。
    因此,如果 p 是一个指针变量,则 p = 0;、p = 0L;、p = ‘\0’;、p = 3 - 3;、p = 0 * 17; 中的任何一种赋值操作之后(对于 C 来说还可以是 p = (void*)0;), p 都成为一个空指针,由系统保证空指针不指向任何实际的对象或者函数。反过来说,任何对象或者函数的地址都不可能是空指针。


    NULL

    NULL 是一个标准规定的宏定义,用来表示空指针常量。因此,除了上面的各种赋值方式之外,还可以用 p = NULL; 来使 p 成为一个空指针。


    空指针指向地址

    我们常见的空指针一般指向 0 地址,即空指针的内部用全 0 来表示(zero null pointer,零空指针);也有一些系统用一些特殊的地址值或者特殊的方式表示空指针(nonzero null pointer,非零空指针)。


    判断空指针

    这可以通过与空指针常量或者其它的空指针的比较来实现(注意与空指针的内部表示无关)。例如,假设 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 )


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

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

    展开全文
  • NULL 0的区别

    2016-04-13 18:19:41
    NULL表示地址是程序首地址:0x00000000。 #ifndef NULL  #ifdef _cplusplus  define NULL 0 else  define NULL ((void *)0) #endif #undif 在标准c++中规定:在一个指针类型为0时,都可以认为是...

          在c++中,指针为空是NULL。NULL表示的地址是程序的首地址:0x00000000。

    #ifndef  NULL

      #ifdef _cplusplus

      define NULL 0

    else

     define NULL ((void *)0)

    #endif

    #undif

    在标准c++中规定:在一个指针的类型为0时,都可以认为是一个空指针。(在其他标准下,也可以是1或者2来代替NULL)

    例如:vs 2010中

    int *p = NULL;

    和 

    int * p = 0;

    都是可以编译通过。而且都可以打印出现来的地址值。int *p = 0;是用来说明零指针的意义。零指针也是空指针。

    这也是int *p = 5不能通过的原因.

    展开全文
  • C语言NULL和0的区别详解

    千次阅读 2017-04-30 15:25:27
    C语言NULL和0的区别详解1.分析0 would digit zero, that is, a numerical value. '0' could be the character capital oh or the character zero. For example: char word[10] = "Oxford"; char number[10] = "01234...

    C语言NULL和0的区别详解

    1.分析

    0 would digit zero, that is, a numerical value.
    '0' could be the character capital oh or the character zero. For example: char word[10] = "Oxford"; char number[10] = "01234";
    Depending on typeface used 'O' may look exactly like '0' making it difficult to tell them apart out of context.
    '\0' is the null character used to terminate strings in C/C++.
    "\0" is an empty string.
    
    • 在C语言及其派生语言中,\0不是一个单独的转义序列,而是一个以八进制表示常数,而常数的数值为0,\0后面不能接0至7的数字,不然会视为是一个八进制的数字。

    • NULL和0的值都是一样的,但是为了目的和用途及容易识别的原因,NULL用于指针和对象,0用于数值。对于字符串的结尾,使用’\0’,它的值也是0,但是让人一看就知道这是字符串的结尾,不是指针,也不是普通的数值。

    • 在不同的系统中,NULL并非总是和0等同,NULL仅仅代表空值,也就是指向一个不被使用的地址,在大多数系统中,都将0作为不被使用的地址,所以就有了类似这样的定义。但并非总是如此,也有些系统不将0地址作为NULL,而是用其他的地址,所以说,千万别将NULL和0等价起来,特别是在一些跨平台的代码中,这更是将给你带来灾难 #define NULL 0

    2.空指针常量

     An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant
    
    • NULL在stdio.h中的定义:
    #if !defined(NULL) && defined(__NEEDS_NULL)
    #ifdef __cplusplus
    #define NULL    0
    #else
    #define NULL    ((void *)0)
    #endif
    #endif
    • 在c++定义为0,在c中定义为(void *)0;的原因:

    注意: 0、0L、’\0’、3 - 3、0 * 17 (它们都是“integer constant expression”)以及 (void*)0 等都是空指针常量(注意 (char*) 0 不叫空指针常量,只是一个空指针值)

    • 一般的 C 系统选择 (void*)0 或者 0 的居多(也有个别的选择 0L);至于 C++ 系统,由于存在严格的类型转化的要求,void* 不能象 C 中那样自由转换为其它指针类型,所以通常选 0 作为空指针常量

    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.
    
    • char *p=0;此时p就是一个空指针,不指向任何实际对象。
      因此,如果 p 是一个指针变量,则 p = 0;、p = 0L;、p = ‘\0’;、p = 3 - 3;、p = 0 * 17; 中的任何一种赋值操作之后(对于 C 来说还可以是 p = (void*)0;),p 都成为一个空指针,由系统保证空指针不指向任何实际的对象或者函数。反过来说,任何对象或者函数的地址都不可能是空指针。(tyc: 比如这里的(void*)0就是一个空指针

    4.NULL

    The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant
    
    • 即 NULL 是一个标准规定的宏定义,用来表示空指针常量。因此,除了上面的各种赋值方式之外,还可以用 p = NULL; 来使 p 成为一个空指针。(tyc:很多系统中的实现:#define NULL (void*)0,与这里的“a null pointer constant”并不是完全一致的)

    5.空指针的内部实现

    • 标准并没有对空指针指向内存中的什么地方这一个问题作出规定,我们常见的空指针一般指向 0 地址,即空指针的内部用全 0 来表示(zero null pointer,零空指针);也有一些系统用一些特殊的地址值或者特殊的方式表示空指针(nonzero null pointer,非零空指针)

    • 注意:不要把空指针的内部表示等同于整数 0 的对象表示

    6.判断一个指针是否是一个空指针

    • 假设 p 是一个指针变量,q 是一个同类型的空指针,要检查 p 是否是一个空指针,可以采用下列任意形式之一

      if ( p == 0 )
      if ( p == '\0' )
      if ( p == 3 - 3 )
      if ( p == NULL )
      if ( NULL == p )
      if ( !p )
      if ( p == q )
      
    • 注意:不可以用 memset 函数来得到一个空指针。
      因为有的系统存在着“非零空指针” (nonzero null pointer),所以这时 memset( &p, 0, sizeof(p) ); 和 p = 0; 这两者不等价

    7.自定义NULL

    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 的话,则再在程序中重新定义NULL为不同的内容是非法的,其行为是未定义的。即NULL只能是 0

    8.malloc分配内存失败的的返回

    If the space cannot be allocated, a null pointer is returned.
    
    • malloc 函数是标准C规定的库函数。在标准中明确规定了在其内存分配失败时返回的是一个 “null pointer”(空指针)

    9.字符的结束符’\0’

    • ‘\0’是C++中字符串的结尾标志,存储在字符串的结尾。

    • eg: char cha[5]表示可以放5个字符的字符串,由于c/c++中规定字符串的结尾标志为’\0’,它虽然不计入串长,但要占内存空间.

    • 一个汉字一般用两个字节表示,且c/c++中如一个数组cha[5],有5个变量,分别是 cha[0] , cha[1] , cha[2] , cha[3] , cha[4] , 所以cha[5]可以放5个字母或者放2个汉字(1个汉字占2个字节,1个字母占一个字节),cha[5]占5个字节内存空间.

    10.参考文章

    链接:

    1. http://www.cnblogs.com/youxin/archive/2012/03/27/2420023.html
    2. https://zh.wikipedia.org/wiki/%E7%A9%BA%E5%AD%97%E7%AC%A6
    展开全文
  • c和c++中NULL和0的区别

    2014-08-01 14:10:01
    c和c++中NULL和0的区别 1,什么是空指针常量(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 ...

    c和c++中NULL和0的区别


    1,什么是空指针常量(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.

    这里告诉我们:0、0L、'\0'、3 - 3、0 * 17 (它们都是“integer constant expression”)以及 (void*)0 (tyc: 我觉得(void*)0应该算是一个空指针吧,更恰当一点)等都是空指针常量(注意 (char*) 0 不叫空指针常量,只是一个空指针值)。至于系统选取哪种形式作为空指针常量使用,则是实现相关的。一般的 C 系统选择 (void*)0 或者 0 的居多(也有个别的选择 0L);至于 C++ 系统,由于存在严格的类型转化的要求,void* 不能象 C 中那样自由转换为其它指针类型,所以通常选 0 作为空指针常量(tyc: C++标准推荐),而不选择 (void*)0。

     

    2,什么是空指针(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会有微秒的不同,当然也不是紧要了)

     

    3,什么是 NULL?

    [6.3.2.3-Footnote] The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant

    即 NULL 是一个标准规定的宏定义,用来表示空指针常量。因此,除了上面的各种赋值方式之外,还可以用 p = NULL; 来使 p 成为一个空指针。(tyc:很多系统中的实现:#define NULL (void*)0,与这里的“a null pointer constant”并不是完全一致的)

     

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

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

     

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

     

    5,如何判断一个指针是否是一个空指针?

    这可以通过与空指针常量或者其它的空指针的比较来实现(注意与空指针的内部表示无关)。例如,假设 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 )

    ...

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

    这个问题等同于:如果 p 是一个指针变量,那么

    memset( &p, 0, sizeof(p) ); 和 p = 0;

    是等价的吗?

    答案是否定的,虽然在大多数系统上是等价的,但是因为有的系统存在着“非零空指针” (nonzero null pointer),所以这时两者不等价。由于这个原因,要注意当想将指针设置为空指针的时候不应该使用 memset,而应该用空指针常量或空指针对指针变量赋值或者初始化的方法。

     

    7,可以定义自己的 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 等。

     

    8,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吧)

    另外,附C FAQ上关于null pointer的解释:C FAQ:null pointer

    展开全文
  • NULL和0的区别 1,什么是空指针常量(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 ...
  • #include<...NULL和0的值都是一样的,但是为了目的和用途及容易识别的原因,NULL用于指针和对象,0用于数值 对于字符串的结尾,使用’\0’,它的值也是0,但是让人一看就知道这是字符串的结尾,不是指针,
  • C++中“NULL“0”的区别是什么? 0是一个数字,本身有着一些原生的特性诸如:起始,没有,正负的分界线,0/1中的0还可以表示否定。0可以表示数字0,也可以表示ASCII码值为0的字符。 NULL用于将指针指定...
  • NULL和0的区别,nullptr的来历

    千次阅读 2018-09-23 16:45:26
      某些时候,我们需要将指针赋值为空指针,以防止野指针。...也有人直接使用0值作为空指针常量,例如:int* p = 0;。   前者可能觉得:NULL作为空指针常量,名字很形象,可读性较强。 后者可...
  • C++中NULL和0的区别

    千次阅读 2014-01-09 19:15:52
    今天用tinyxml2写程序,发现NULL 0在有些时候是相等,以前没注意过这个问题。 所以上网搜索了一下,在stackoverflow上找到比较靠谱回答: ...
  • C和C++中NULL和0的区别

    2013-02-16 17:20:33
    1,什么是空指针常量(null ...[6.3.2.3-3] Aninteger constant expression with the value 0, or such an expression cast totype void *, is called a null pointer constant. 这里告诉我们:00L、'\0'、3 - 3、0 *
  • 今天写代码时候出现一个问题: ... //failTime 不为null 且 failTime 不等于 undefined 且 小于5 时 才能走下面代码 failTime = 0; if(failTime && failTime != undefined && parseInt(failTime)
  • C语言基础,NULL和0,结构体初始化取值
  • c/c++中的NULL和0的区别

    2011-10-26 18:14:55
    stdlib.h中 /* Define NULL pointer value */ #ifndef NULL ...#define NULL 0 #else #define NULL ((void *)0) #endif #endif c++中NULL就是0 但是c中NULL却需要强制转换。 为什么? 不知道啊!!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,027
精华内容 1,210
关键字:

null和0的区别