SOUI官方论坛

 找回密码
 立即注册
查看: 886|回复: 3

NULL,0,'\0',“0”,"\0"你真的分得清吗?

[复制链接]
  • TA的每日心情
    开心
    前天 22:51
  • 签到天数: 946 天

    [LV.10]以坛为家III

    581

    主题

    1343

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    28876
    发表于 2019-9-6 09:56:52 | 显示全部楼层 |阅读模式
    作者:守望,Linux应用开发者,目前在公众号【编程珠玑】 分享Linux/C/C++/数据结构与算法/工具等原创技术文章和学习资源。
    前言

    在C语言中,我们有时候看到NULL,有时候也看到'',那它们之间有什么区别呢?
    本质

    本质来说,NULL,0,''都是一样的,都是值0。是的,你没有听错。说到这本文差不多应该结束了。不过为了不被打,还是继续说一说。它们虽然值都是0,但是含义却是不一样的。
    NULL

    虽然值是0,但是它的含义不一样,或者说它的类型不一样。NULL是指针类型,不过它是空指针,即值为0。
    //来源:公众号【编程珠玑】 博客:https://www.***binghu.com
    //null.c
    #include<stdio.h>
    int main(void)
    {
       
    int a = NULL;
       
    printf("%p",a);
       
    return 0;
    }

    我们编译它:
    $ gcc -o null null.c
    null.c: In function ‘main’:
    null.c:14:10: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
      
    int a = NULL;
              ^

    它给了我们一个警告,提示尝试将指针转换为整数。这也就正验证了我们前面的说法。
    实际上NULL通常是如下定义:
    #define NULL (void*)0
    所以,如果要给一个指针类型初始化,那么你给它一个NULL,使得能够明显的看到这是一个指正。
    当然,在C++中,你更应该使用nullptr,而不是NULL。
    '\0'

    我们都知道是转义符,用单引号包起来,再加转义,实际上就是0,只不过它表示的是字符。就向下面这样:
    //来源:公众号【编程珠玑】 博客:https://www.***binghu.com
    //nul.c
    #include<stdio.h>
    int main(void)
    {
       
    char a = '';
       
    char b = '0';
       
    printf("a = %d,b = %d",a,b);
       
    return 0;
    }

    编译运行:
    $ gcc -o nul nul.c
    ./nul
    a = 0,b = 48

    我们最常见到的就是它作为字符串的结束符。所以我们常常会看到下面这样的写法:
    char str[16];
    /*do something*/
    str[
    15] = '';
    还记得printf是如何打印字符串,以及strcmp比较停止规则吗?是的,它们都以遇到''结束。
    注意,它和'0'完全不一样。通过打印就可以看到了,实际上''的值就是0。
    需要特别注意的是,如果''的0后面跟八进制的数,则会被转义。所以'0'与'0'的值一致。
    0

    这个不用多解释。
    int a = 0;
    "0"

    用双引号包裹的0是字符串,我们看不到的是它结尾还有一个’‘
    #include<stdio.h>
    int main(void)
    {
       
    char str[] = "0";
       
    printf("sizeof str is %d,string len is %d",sizeof(str),strlen(str));
       
    return 0;
    }

    运行结果:
    sizeof str is 2,string len is 1
    "\0"

    这也是字符串,只不过是两个空字符。使用strlen计算字符串长度为0。
    ""

    字符串。字符串长度为1,占用空间2字节,是一个空格加空字符。
    总结

    到这里你应该明白了,它们的值可能一样,但赋予的含义却不一样,为了代码良好的可读性,你应该在恰当的时候使用合适的值。


  • TA的每日心情
    奋斗
    2022-7-4 09:45
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    59

    主题

    590

    帖子

    5517

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    5517

    突出贡献优秀版主

    发表于 2019-9-6 11:23:31 | 显示全部楼层
    我只喜欢用NULL,0,别的都不用。
  • TA的每日心情
    慵懒
    2024-1-24 14:08
  • 签到天数: 313 天

    [LV.8]以坛为家I

    13

    主题

    114

    帖子

    6011

    积分

    08:00大乘期

    Rank: 8Rank: 8

    积分
    6011
    发表于 2019-9-6 12:51:20 | 显示全部楼层
    后面三很少用

    该用户从未签到

    4

    主题

    58

    帖子

    604

    积分

    04:00化神期

    Rank: 4

    积分
    604
    发表于 2019-9-6 13:00:28 | 显示全部楼层
    NULL不是int型的0吗,nullptr才是空指针吧
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|SOUI官方论坛

    GMT+8, 2024-5-18 23:30

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表