精华内容
下载资源
问答
  • C语言空指针NULL以及void指针
    http://blog.csdn.net/shuimanting520/article/details/51360139
    
    展开全文
  • C语言空指针NULL详解

    千次阅读 2019-11-04 13:04:25
    空指针NULL: 在C语言中,如果一个指针不指向任何数据,我们就称之为空指针,用NULL表示。例如: int *p = NULL; NULL 是一个宏定义,在stdio.h被定义为: #define NULL ((void *)0) 那么我们来看看什么是空...

    空指针NULL:

    在C语言中,如果一个指针不指向任何数据,我们就称之为空指针,用NULL表示。例如:

    int *p = NULL;

    NULL 是一个宏定义,在stdio.h被定义为:

    #define NULL ((void *)0)

    那么我们来看看什么是空指针?

    [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.

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

    那么什么是NULL??

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

    即 NULL 是一个标准规定的宏定义,用来表示空指针常量。因此可以用 a = NULL; 来使 a 成为一个空指针。(tyc:很多系统中的实现:#define NULL (void*)0,与这里的“a null pointer constant”并不是完全一致的)。如果包含了相应的标准头文件而引入了 NULL 的话,则再在程序中重新定义 NULL 为不同的内容是非法的,其行为是未定义的。也就是说,如果是符合标准的程序,其 NULL 的值只能是 0,不可能是除 0 之外的其它值,比如 1、2、3 等。

    根据下面这行代码我们来理解一下空指针NULL:

    #include <stdio.h>
     int main()
    { 
    int *a = NULL;
    printf("%d\n", a); 
    return 0; 
    } 
    运行结果: 0

    根据宏定义我们知道:

    (void *)0表示把数值 0 强制转换为void *类型,最外层的( )把宏定义的内容括起来,我们自己进行宏定义时也推荐这么做,防止发生歧义,所以最后运行结果为0。

    那么你现在是否会想NULL和0是等价的呢??

    答案肯定是否定的,我们都知道变量定义系统就会给他分配内存空间,指针变量也是如此,如果指针没有指向的话那么地址就是随机值。

    例如:

    int *p;//它不是空指针

    这个指针的地址是一个随机值,如果不小心用的话就会导致数据错误,从而使程序退出。

    NULL 使 p 指向地址 0。大多数系统中都将 0 作为不被使用的地址,所以运用 p 也不会毁坏数据。但并非总是如此,也有系统会使用地址 0,而将 NULL 定义为其他值,所以不要把 NULL 和 0 等同起来。

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

    if ( p == 0 )

    if ( p == '\0' )

    if ( p == NULL ) /* 使用 NULL 必须包含相应的标准库的头文件 */stdio.h

    if ( NULL == p )

    if ( !p ) <---------------(这里和下面的if(p)都被专门说过一次,null定义不一定是0.这里如果贸然使用!p会很危险的.上面也专门解释了这种写法的危险性,所以这种写法不能被提倡)

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

    if ( p != 0 )

    if ( p != '\0' )

    if ( p != NULL ) /* 使用 NULL 必须包含相应的标准库的头文件 */stdio.h

    if ( NULL != p )

    if ( p != q )

    如果大家对C语言感兴趣,可以关注小编公众号与小编一起学习C语言!!小编有干货的话会免费分享给大家的哦!!!

     

    展开全文
  • C语言空指针NULL以及void指针shuimanting520 2016-05-10 07:12:12 18926 收藏 30分类专栏: C/C++ 文章标签: C++ 指针 void NULL版权空指针NULL在C语言中,如果一个指针不指向任何数据,我们就称之为 空指针 ,用 ...

    C语言空指针NULL以及void指针

    shuimanting520 2016-05-10 07:12:12 18926 收藏 30

    分类专栏: C/C++ 文章标签: C++ 指针 void NULL

    版权

    空指针NULL

    在C语言中,如果一个指针不指向任何数据,我们就称之为 空指针 ,用 NULL 表示。例如:

    int *p = NULL;注意区分大小写,null 没有任何特殊含义,只是一个普通的标识符。

    NULL 是一个宏定义,在 stdio.h 被定义为:

    define NULL ((void *)0)

    (void )0 表示把数值 0 强制转换为 void 类型,最外层的 ( ) 把宏定义的内容括起来,我们自己进行宏定义时也推荐这么做,防止发生歧义。

    总之,p 的值为 0。你可以输出 p 的值:#include

    int main(){

    int *p = NULL;

    printf("%d\n", p);

    return 0;

    }

    运行结果:

    0

    我们知道,变量一旦定义就要分配内存,指针变量也是如此。例如:

    int *p; //它不是空指针

    它的值是随机的,是垃圾值,如果不小心使用了它,运行时一般会引起段错误,导致程序退出,甚至会不知不觉地修改数据。

    p 经过定义,就一定在内存中分配了4个字节(32位环境)的空间,只是它的值是随机的,不像 int 会被初始化为 0,但是它确实指向了一段正常使用的内存。使用 p 时,操作的就是这段内存的数据,幸运的话能够正常运行,不过大部分情况下这段内存是无权操作的。

    NULL 使 p 指向地址 0。大多数系统中都将 0 作为不被使用的地址,所以吴用 p 也不会毁坏数据。

    但并非总是如此,也有系统会使用地址 0,而将 NULL 定义为其他值,所以不要把 NULL 和 0 等同起来,下面的写法也是不专业的:

    int *p = 0;

    而应该坚持写为:

    int *p = NULL;注意 NULL 和 NUL 的区别:NULL表示空指针,是一个宏定义,可以在代码中直接使用。而 NUL 表示字符 '\0',也就是字符串结束标志,它是ASCII码表中的第 0 个字符。NUL 没有在C语言中定义,仅仅是对 '\0' 的称呼,不能在代码中直接使用。

    void 指针

    C语言还有一种 void 指针类型,即可以定义一个指针变量,但不说明它指向哪一种类型数据。例如:

    void *p = malloc(2);

    在内存中分配2个字节的空间,但不确定它保存什么类型的数据。注意,void 指针与空指针 NULL 不同:NULL 说明指针不指向任何数据,是“空的”;而 void 指针实实在在地指向一块内存,只是不知道这块内存中是什么类型的数据。

    展开全文
  • 对于空(null)指针的概念,在 C 标准中明确地定义:值为 0 的整型常量表达式,或强制(转换)为“void*”类型的此类表达式,称为空指针常量。 当将一个空指针常量赋予一个指针或与指针作比较时,将把该常量转换为...

    对于空(null)指针与 NULL 指针,相信许多读者对它们之间的关系都很迷惑,甚至有很大一部分读者会认为它们根本就是一回事。其实不然,它们之间存在着一定的本质区别,下面就来详细阐述它们之间的不同。

    对于空(null)指针的概念,在 C 标准中明确地定义:值为 0 的整型常量表达式,或强制(转换)为“void*”类型的此类表达式,称为空指针常量。

    当将一个空指针常量赋予一个指针或与指针作比较时,将把该常量转换为指向该类型的指针,这样的指针称为空指针。空指针在与指向任何对象或函数的指针作比较时保证不会相等。

    根据上面的定义,我们可以对空指针做如下几点剖析:

            1) 每一种指针类型都有一个空指针,它与同类型的其他所有指针值都不相同。

            2) 由系统保证空指针不指向任何实际的对象或函数,也就是说,任何对象或者函数的地址都不可能是空指针,空指针与任何对象或函数的指针值都不相等。因此,取地址操作符 & 永远也不能得到空指针,同样对 malloc() 函数的成功调用也不会返回空指针,但如果调用失败,则 malloc() 函数返回空指针。

            3) 空指针表示“未分配”或者“尚未指向任何地方”。它与未初始化的指针有所不同,空指针可以确保不指向任何对象或函数,而未初始化指针可能指向任何地方。

            4) 0、0L、'\0'、3-3、0*17以及(void*)0等都是空指针常量,则:

    int *p;
    
    p=0;
    
    /*或者*/
    
    p=0l;
    
    /*或者*/
    
    p='\0';
    
    /*或者*/
    
    p=3-3;
    
    /*或者*/
    
    p=0*17;
    
    /*或者*/
    
    p=(void*)0;

    指针变量 p 经过上面任何一种赋值操作之后都将成为一个空指针。至于编译时系统究竟选取哪种形式作为空指针常量使用,则与具体实现相关。在一般情况下,对于 C 语言系统,选择“(void*)0”或 0 的居多(也有个别的选择 0L);而对于 C++ 语言系统,由于存在严格的类型转化的要求,“void*”不能像在 C 语言中那样自由转换为其他指针类型,所以通常只选 0 作为空指针常量,而不选择“(void*)0”。

            5) 对于空指针究竟指向内存的什么地方,在标准中并没有明确规定。也就是说,用哪个具体的地址值(0 地址还是某一特定地址)来表示空指针完全取决于系统的实现。在一般情况下,空指针指向 0 地址,即空指针的内部用全 0 来表示,也可以称它为零空指针。当然,也有一些系统用一些特殊的地址值或特殊的方式来表示空指针,也可以称它为非零空指针。

    但在实际编程中,我们并不需要了解在系统上的空指针到底是一个零空指针还是一个非零空指针。而我们仅仅只需要知道一个指针是否是空指针就可以了,编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。因此,千万不要把空指针的内部表示等同于整数0的对象表示,有时它们是不同的。

    在了解空指针的概念之后,下面来看 NULL 指针。

    作为一种良好的编程习惯,很多程序员都不愿意在程序中到处出现未加修饰的 0 或者其他空指针常量。

    为了让程序中的空指针使用更加明确,从而保持统一的编程风格,标准 C 专门定义了一个标准预处理宏 NULL,其值为“空指针常量”,通常是 0 或者“((void*)0)”,即在指针上下文中的 NULL 与 0 是等价的,而未加修饰的 0 也是完全可以接受的。

    如在 VC++ 中定义预处理宏 NULL 的代码如下:

    /* Define NULL pointer value */
    
    #ifndef NULL
    
    #ifdef __cplusplus
    
    #define NULL    0
    
    #else
    
    #define NULL   ((void *)0)
    
    #endif
    
    #endif

    这里需要说明的是,当 NULL 定义为“((void *)0)”时,即 NULL 是可以赋值给任何类型指针的值,它的类型为 void*,而不是整数 0,因此初始化“FILE*fp=NULL;”是完全合法的。

    而为了区分整数 0 和空指针 0,当需要其他类型的 0 时,即使可能工作,也不能使用 NULL,因为这样处理其格式是错误的,这种类型在非指针上下文中是不能工作的。特别需要注意的是,不能在需要 ASCII 空字符(NUL)的地方使用 NULL。如果确实需要,则可以自定义为:

    #define NUL '\0'

    由此可见,常数 0 是一个空指针常量,而 NULL 仅仅是它的一个别名。NULL 可以确保是 0,但空(null)指针却不一定。不管你是转行也好,初学也罢,进阶也可,如果你想学编程,进阶程序员~

    【值得关注】我的 编程学习交流俱乐部 【点击进入】

    C语言入门资料:

    C语言必读书籍:

    展开全文
  • C语言空指针

    2020-04-06 13:10:12
    空指针 定义:不指向任何数据的指针,用NULL表示; int *p=NULL; 分析:空指针保证与任何对象或函数的指针值都不相等,也就是说空指针不会指向任何对象或函数的地址; 典型用法:malloc函数,当分配内存失败时就会返回...
  • 本篇文章是对C语言中空指针、空指针常量、NULL & 0 进行了详细的分析介绍,需要的朋友参考下
  • C语言 空指针和野指针

    千次阅读 2018-06-21 16:21:32
    //空指针 int *p2;//野指针指向空的指针是空指针,指向一块未知区域的指针是野指针例如 int *p = 0x123456; 这就是一个野指针,我们并不知道这个地址存的是什么内容注意下面的例子void freePoint(int *&amp;p)...
  • C语言指针赋值0 NULL null 空指针

    千次阅读 2019-03-07 11:06:53
    用编译器试验了一下 会得到一个空指针! 其实这种现象在C语言中是有定义的。 值为0的整形常数表达式或强制转换为void *类型的表达式可通过强制类型转换、赋值或比较操作转换为任意类型的指针。 其结果将产生一...
  • 什么是空指针常量(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、0L、1-1(它们都是值为0的整数常量表达式)以及(void*)0、void* NULL 都是空指针常量,空指针常量可以赋值给任何指针类型,因为它是变体类型(void*)。但是我们更倾向于使用NULL表示这个空指针常量。对于其它...
  • 一、NULL空指针 一个指针变量可以指向计算机中的任何一块内存,不管该内存有没有被分配,也不管该内存有没有使用权限,只要把地址给它,它就可以指向,C语言没有一种机制来保证指向的内存的正确性,程序员必须自己...
  • 空指针NULLC语言中,如果一个指针不指向任何数据,我们就称之为空指针,用NULL表示。例如:int *p = NULL;注意区分大小写,null 没有任何特殊含义,只是一个普通的标识符。NULL 是一个宏定义,在stdio.h被定义为:...
  • //野指针与空指针的区别 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<...//野指针是指存在一个指针变量,但是这个指针变量指向的内存空间已经...空指针是值为NULL的指针变量 void ma...
  • 空指针 null

    2021-05-29 01:00:03
    1、空指针 nullC语言中没有一种机制来保证指向内存的正确性; ●未初始化的指针变量指向哪块内存是不确定的,大多数情况下这块内存没有被分配或者没有读写权限,向其写入数据有可能就会出现错误; ●未...
  • 2.在访问任何指针变量之前检查空指针。这样,我们可以在与指针相关的代码中执行错误处理,例如,仅当其不为NULL时才取消引用指针变量。3.当我们不想传递任何有效的内存地址时,将空指针传递给函数参数。1的例子是2的...
  • C语言中的空指针空指针常量、NULL & 0   本文转自:http://bbs.chinaunix.net/viewthread.php?tid=544415&extra=&page=7  帖子里讨论了C语言中的空指针空指针常量、NULL、0等概念及...
  •  帖子里讨论了C语言中的空指针空指针常量、NULL、0等概念及相互关系及区别。这里摘录whyglinux兄的总结。做个标签,呵呵^_^ 什么是空指针常量(null pointer constant)?[6.3.2.3-...
  • 原文链接:http://www.linuxidc.com/Linux/2012-12/76249.htm什么是空指针常量(null pointer constant)? [6.3.2.3-3] An integer constant expression with the value 0, or such an expression cast to type ...
  • NULL:代表空指针,也就是指向一个不被使用的地址。 0 :0用于数值,但在大多数系统中,都将0作为不被使用的地址,所以0有时与NULL都可指向不确定的地址。 ‘\0’ :对于字符串的结尾,使用’\0’。 ...
  • 本文转自:http://bbs.chinaunix.net/viewthread.php?tid=544415&extra=&page=7帖子里讨论了C语言中的空指针空指针常量、NULL、0等概念及相互关系及区别。什么是空指针常量(null pointer constant)?[6.3.2.3-3] ...
  • 空指针: 没有存储任何内存地址的指针为空指针(指向编号为0的指针) 该指针是不可以访问的 int *p = NULL; 野指针: 指向非法内存的指针,该指针是不可以访问的 int *p = 0x10440; ...
  • c语言NULL和0的值都是一样的,但是为了目的和用途及容易识别的原因,NULL用于指针和对象,0用于数值对于字符串的结尾,使用’\0’,它的值也是0,但是让人一看就知道这是字符串的结尾,不是指针,也不是普通的数值。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 938
精华内容 375
关键字:

c语言空指针null

c语言 订阅