• C语言tips-NULL指针和void指针


    0.写在最前

    最近因为工作需要开始重新学c语言,越学越发现c语言深不可测,当初用python轻轻松松处理的一些数据,但是c语言写起来却异常的复杂,这个板块就记录一下我的c语言复习之路

    1. void指针

    1.1 解释

    void 用在函数定义中可以表示函数没有返回值或者没有形式参数,用在这里表示指针指向的数据的类型是未知的,而void *表示一个有效指针,它确实指向实实在在的数据,只是数据的类型尚未确定,在后续使用过程中一般要进行强制类型转换。

    void指针我们把它称为通用指针,就是可以指向任意类型的数据,也就是说,任何类型的指针都可以赋值给void指针

    比较常见的malloc函数默认返回的类型就为void*,malloc函数原型: void *__cdecl malloc(size_t _Size);

    1.2 使用

    在使用void指针的时候需要强制类型转换

    #include 
    
    int main() {
        int num = 1024;
        int *pi = #
        char *ps = "Fishc";
        void *pv;
        pv= pi;
        printf("%d\n", *(int *)pv);
        pv = ps;
        printf("%s", (char *)pv);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2. NULL指针

    2.1 解释

    NULL 是“零值、等于零”的意思,在 C 语言中表示空指针。从表面上理解,空指针是不指向任何数据的指针,是无效指针,程序使用它不会产生效果,我们可以在#include 在这个头文件找到NULL的定义:#define NULL ((void *)0),可以看到NULL是一个指针,他的类型为void *值为0

    2.2 使用

    NULL的使用还是比较广泛的,我们很多时候需要先定义一个指针类型然后再让其指向,这样的话我们就可以先初始化让他指向一个NULL,否则初始化定义的指针它的值是随机的,鬼只知道它会指向什么,我可以看看以下例子

    例子1:

    #include 
    
    
    int main(int argc, char* argv[])
    {
        // 初始化一个指针未给它初始化定义
        char* str=NULL;
        // 直接打印它所指向的值
        printf("%s", str);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    我们在clion输出可以发现,直接可以打印一个(null)

    #include 
    
    
    int main(int argc, char* argv[])
    {
        // 初始化一个指针未给它初始化定义
        char* str;
        // 直接打印它所指向的值
        printf("%s", str);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    而运行以上代码,我们可以发现没有任何输出,我们可以考虑其实printf是有对NULL指针做处理的,但是如果你指向未知的地址,就不会有任何提示输出,出现错误。

  • 相关阅读:
    低成本简易信号幅值调节/信号叠加电路
    利用Python进行数据分析——函数部分
    kubernetes集群配置默认存储类(nfs)
    【Hack The Box】linux练习-- Node
    从OC角度思考OKR的底层逻辑
    IEEE754 标准存储浮点数
    池化层是有什么作用
    D - Square Permutation-AtCoder Beginner Contest 324
    MyBatis中的StrictMap类
    基于JAVA的会议管理系统参考【数据库设计、源码、开题报告】
  • 原文地址:https://blog.csdn.net/weixin_46187354/article/details/128050877