【C语言】'\0'、'0'、' '、“0”、0的区别详解

在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)、以及0、1等数字符号还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。
有关字符集和编码的内容继续在微信公众号:AutoCodes中推出。
需要明白的是,这里的映射关系式“字符” <–>“数字(编码)”。
第一部分:区别第一:’\0’
是字符,其ASCII码为0,内存中存放表示:0000 0000。
‘\0’是一个ASCII控制字符,是转义字符,代表空字符。作为字符串结尾字符。字符’\0’可以直接用ASCII码0表示,0不管是几进制,都是0(十进制),也就是0x00(十六进制)。
char c = ‘\0’;
char c = 0; //ASCII码为0的字符赋给字符变量c
这两个是一样的。当你打印的时候看你以什么形式去打印,如果是 %d,那会打印出0,如果是 %c 打印出一个空格,不是输出到屏幕上’\0’。’\0’与 0 本质上其实是一样的,一个是ASCII码,一个是该ASCII码对应的字符。字符串结束符 ‘\0’ 的ASCII 值正好是 0。所以用0判断和用 ‘\0’ 判断,结果一样(在内存中存放一样)。
‘\0’就表示将字符’0’转义,系统遇到’\0’时输出一个空格,从而表示ASCII码为0的字符(字符串结束符),而数值0和这个是一个意思,
‘\0’是字符数组或者字符串结束标志,系统在引用字符数组或者字符串的时候遇到‘\0’就会结束,在进行字符数组初始化的时候,这个‘\0’是自动加上去的。而‘0’可以作为字符数组的一个元素。
第二:‘0’
‘0’是数字字符,其ASCII码为48,也就是0x30,内存中存放表示:0011 0000
第三:’ ’
’ ‘空格是一个字符,其ASCII码为32,内存中存放表示:0011 0000
比如 abcd (空格)cdefg;
存入数组时,空格作为一个字符占有一个字节的空间,我们可以把它看作一个字符去处理。而 “\0” 则是这个字符串的结束标识符,也占有一个字节的空间,表示字符串结束!
第四:“0”
"0"是字符串。
“0”代表字符串“0”,即这个字符串里只包含一个字符’0’(当然字符串结尾默认再加一个’\0’)
第五:0
0是个整数,内存中表示为0000 0000,0就代表阿拉伯数字0
在逻辑运算值方面,0和’0’(ascii码值为48)的主要区别,比如 !0=1 !‘0’=0;
字符0的ASCII码实际上是48,C语言中字符0 只占一个字节(Byte),也就是内存中存放的是 01001000 (其中每一个0或1表示一个bit位)
而整数0, 它在内存中的表示全是0,C语言中一个整数的占4个字节,整数0在内存中的表示为: 00000000 00000000 0000000000000000 .
如下:
char c = ‘0’; //字符0
int a = 0; //整数0
printf("%c, %d\n", c, a);//0,0
printf("%d\n", c);//48 用整数形式打印字符,实际是打印c在内存中的值。
printf("%d\n", (c+a)); //48
printf("%c\n",(char)(c+a)); //0
输出的结果:
0,0
48
48
0
从上面你就能看出字符0和整数0的区别了。
第二部分:内容扩展
附:如果用scanf来接收字符串的话,字符串中不能含有空格,否则将以空格作为串的结束符。如果你键入得是hello world 那么实际上scanf只能获取hello 这个单词。所以要接收空格的话可以用gets()这个函数。gets(str)是读入一串以回车结束的字符,顺序存入到以str为首地址的内存单元中,最后写入字符串结束标志“\0 “,
同样在输出字符串时要用puts(),输出时直到遇到 \0 为止,最后输出一个换行符。
第三部分:问题
那么,C语言中既然’\0’与空格‘ ’是不一样的,那为什么在字符串问题中,scanf中还不能读入空格?例如字符串"hello world",用scanf以%s格式输入,只能输出"hello",字符串是以‘\0’作为结尾,而‘ ’!=’\0’。为什么呢?
这不是说明空格与\0等价,而是由于C语言的缓冲机制,scanf读取数据不是从键盘直接读取,因为键盘是字符型输入设备,且它是中断方式来被操作系统控制,所以这些IO设备存取速率及其低下,而内存是块设备,读取速度非常快,因此引入缓冲区机制来缓冲IO设备与内存的数据交换,scanf也是从缓冲区地区,而scanf函数是把空格作为缓冲区数据的分隔符,每遇到一个空格,则表示当前一段数据为可用数据,被scanf读取,而不是空格表示字符结束而被读入。
第四部分:遗留问题
在我们平台上,有读者提出这样一个问题:在查找网上资料的过程中,看到有这么一个说法“数字的ASCII码”,数字有ASCCII码吗?
读者认为字符’0’、‘1’…'9’有对应的ASCII码,而数字0、1…9是没有ASCII码的。对于这个问题,给大家一块讨论~学习交流可以薇我13260562029

猜你喜欢

转载自blog.csdn.net/weixin_42832780/article/details/93379334
0
今日推荐