zoukankan      html  css  js  c++  java
  • void指针、NULL指针和未初始化指针

     

      一个指针可以被声明为void类型,比如void *x。一个指针可以被赋值为NULL。一个指针变量声明之后但没有被赋值,叫做未初始化指针。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    int *uninit; // int指针未初始化
    int *nullptr = NULL; // 初始化为NULL
    void *vptr; // void指针未初始化
    int val = 1;
    int *iptr;
    int *castptr;
     
    // void类型可以存储任意类型的指针或引用
    iptr = &val;
    vptr = iptr;
    printf("iptr=%p, vptr=%p ", iptr, vptr);
     
    // 通过显示转换,我们可以把一个void指针转成
    // int指针并进行取值
    castptr = (int *)vptr;
    printf("*castptr=%d ", *castptr);
     
    // 打印null和未初始化指针
    printf("uninit=%p, nullptr=%p ", uninit, nullptr);
    // 不知道你会得到怎样的返回值,会是随机的垃圾地址吗?
    // printf("*nullptr=%d ", nullptr);
    // 这里会产生一个段错误
    // printf("*nullptr=%d ", nullptr);

    执行上面的代码,你会得到类似下面对应不同内存地址的输出。


    2
    3
    iptr=0x7fff94b89c6c, vptr=0x7fff94b89c6c
    *castptr=1
    uninit=0x7fff94b89d50, nullptr=(nil)
     

    第1行我们声明了一个未初始化int指针。所有的指针在赋值为NULL、一个引用(地址)或者另一个指针之前都是未被初始化的。第2行我们声明了一个NULL指针。第3行声明了一个void指针。第4行到第6行声明了一个int值和几个int指针。

    第9行到11行,我们为int指针赋值为一个引用并把int指针赋值为void指针。void指针可以保存各种其它指针类型。大多数时候它们被用来存储数据结构。可以注意到,第11行我们打印了int和void指针的地址。它们现在指向了同样的内存地址。所有的指针都存储了内存地址。它们的类型只在取值时起作用。

    第15到16行,我们把void指针转换为int指针castptr。请注意这里需要显示转换。虽然C语言并不要求显示地转换,但这样会增加代码的可读性。接着我们对castptr指针取值,值为1。

    第19行非常有意思,在这里打印未初始化指针和NULL指针。值得注意的是,未初始化指针是有内存地址的,而且是一个垃圾地址。不知道这个内存地址指向的值是什么。这就是为什么不要对未初始化指针取值的原因。最好的情况是你取到的是垃圾地址接下来你需要对程序进行调试,最坏的情况则会导致程序崩溃。

    NULL指针被初始化为o。NULL是一个特殊的地址,用NULL赋值的指针指向的地址为0而不是随机的地址。只有当你准备使用这个地址时有效。不要对NULL地址取值,否则会产生段错误。

     
     
     
     
  • 相关阅读:
    senrty 配置Email
    pip安装使用详解
    C_FORCE_ROOT linux环境变量设置
    Supervisord管理
    解决外部机器通过VM内ubuntu IP 无法访问vm内web服务的问题
    C# 使用Nlog记录日志到数据库 使用LogEventInfo类获取,命名空间名称、类名、方法名
    godaddy.com 注册域名 买卖域名
    vue-15-vuex-store的用法
    vue-14-less 语法的使用
    vue-13-swiper组件的使用
  • 原文地址:https://www.cnblogs.com/lihuidashen/p/3402231.html
Copyright © 2011-2022 走看看