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

前言

在C语言中,咱们有时候看到NULL,有时候也看到'\0',那它们之间有什么区别呢?算法

本质

本质来讲,NULL,0,'\0'都是同样的,都是值0。是的,你没有听错。说到这本文差很少应该结束了。不过为了避免被打,仍是继续说一说。它们虽然值都是0,可是含义倒是不同的。编程

NULL

虽然值是0,可是它的含义不同,或者说它的类型不同。NULL是指针类型,不过它是空指针,即值为0。bash

//来源:公众号【编程珠玑】 博客:https://www.yanbinghu.com
//null.c
#include<stdio.h>
int main(void) {
	int a = NULL;
	printf("%p\n",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,使得可以明显的看到这是一个指正。ui

固然,在C++中,你更应该使用nullptr,而不是NULL。spa

'\0'

咱们都知道\是转义符,用单引号包起来,再加转义,实际上就是0,只不过它表示的是字符。就向下面这样:指针

//来源:公众号【编程珠玑】 博客:https://www.yanbinghu.com
//nul.c
#include<stdio.h>
int main(void) {
    char a = '\0';
    char b = '0';
    printf("a = %d,b = %d\n",a,b);
    return 0;
}
复制代码

编译运行:code

$ gcc -o nul nul.c
./nul
a = 0,b = 48
复制代码

咱们最多见到的就是它做为字符串的结束符。因此咱们经常会看到下面这样的写法:

char str[16];
/*do something*/
str[15] = '\0';
复制代码

还记得printf是如何打印字符串,以及strcmp比较中止规则吗?是的,它们都以遇到'\0'结束。

注意,它和'0'彻底不同。经过打印就能够看到了,实际上'\0'的值就是0。

须要特别注意的是,若是'\0'的0后面跟八进制的数,则会被转义。因此**'\60'与'0'的值一致**。

0

这个不用多解释。

int a = 0;
复制代码

"0"

用双引号包裹的0是字符串,咱们看不到的是它结尾还有一个’\0‘

#include<stdio.h>
int main(void) {
    char str[] = "0";
    printf("sizeof str is %d,string len is %d\n",sizeof(str),strlen(str));
    return 0;
}
复制代码

运行结果:

sizeof str is 2,string len is 1
复制代码

"\0"

这也是字符串,只不过是两个空字符。字符串长度为0。

" "

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

总结

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

微信公众号【编程珠玑】:专一但不限于分享计算机编程基础,Linux,C语言,C++,数据结构与算法,工具,资源等编程相关[原创]技术文章。

公众号编程珠玑
相关文章
相关标签/搜索