你搞清楚「NULL」、「0」、「'0'」、「0」「\0」了吗?


我们先讨论NULL,平时使用指针的时候,会经常遇见这个家伙,这个家伙的值是是这样定义的

#define NULL 0
或者
#define NULL (void *)0

我们看一下下面这段代码

#include <stdio.h>int main () {size_t ii;int *ptr = NULL;unsigned long *null_value = (unsigned long *)&ptr;if (NULL == 0) {printf ("NULL == 0\n"); }printf ("NULL = 0x");for (ii = 0; ii < sizeof (ptr); ii++) {printf ("%02X", null_value[ii]); }printf ("\n");return 0;
}

程序输出

NULL == 0
NULL = 0x000061FE08000400B1138000--------------------------------
Process exited after 0.02921 seconds with return value 0
请按任意键继续. . .

我们用 &ptr 获取 ptr的地址,然后用 unsigned long * 把这个地址转换成 unsigned long *类型,之后再用 * 钥匙来打开这个地址,获取这个地址的值。只不过这里不是用 *获取,用的是数组偏移。

我们修改下代码

#include <stdio.h>int main () {size_t ii;int *ptr = NULL;unsigned long *null_value = (unsigned long *)&ptr;if (NULL == 0) {printf ("NULL == 0\n"); }printf ("NULL = 0x");for (ii = 0; ii < sizeof (ptr); ii++) {printf ("%02X", null_value[ii]); }printf ("\n");printf("0x%p 0x%p\n",ptr,&ptr);return 0;
}

程序输出

NULL == 0
NULL = 0x000061FE08000400A7138000
0x0000000000000000 0x000000000061FE08--------------------------------
Process exited after 0.03177 seconds with return value 0
请按任意键继续. . .

这样看之后,就觉得没有那么拗口了吧。

我们再讨论下 「'0'」

字符 0 和其他都不能混为一谈,它是一个字符,字符对应的是ascii 码

#include <stdio.h>int main () {char c = '0'; printf("'%c' 0x%x %d\n",c,c,c); return 0;
}

程序输出

'0' 0x30 48--------------------------------
Process exited after 0.02841 seconds with return value 0
请按任意键继续. . .

「"0"」是一个字符串,字符串跟字符的不同是,字符串在最后面有一个字符结束标识 nul

测试程序

#include <stdio.h>
#include <string.h>
int main () {char * str = "0"; int len = strlen(str);printf("%d\n",len); for(int i = 0;i< len +1;i++)printf("[0x%x]",str[i]);return 0;
}

程序输出

1
[0x30][0x0]
--------------------------------
Process exited after 0.02936 seconds with return value 0
请按任意键继续. . .

「\0」这个就有点意思了,这个其实也就是数值 0

测试程序

#include <stdio.h>
#include <string.h>
int main () {char c = '\0';printf("'%c' 0x%x %d\n",c,c,c); return 0;
}

程序输出

' ' 0x0 0--------------------------------
Process exited after 0.03893 seconds with return value 0
请按任意键继续. . .

好了,就这些,看了这些之后,就再也不用担心如果一个字符串里面有 0 字符不知道怎么做算法比较了吧。

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言


嵌入式Linux

微信扫描二维码,关注我的公众号 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

周五跟大佬喝酒,顺便打了个球

这是前天发生的事情&#xff0c;昨天写好了文章&#xff0c;今天才发出来&#xff0c;但是名字还是想写成昨晚小聚。昨晚逍遥和啊尚过来找我打球&#xff0c;很开心&#xff0c;虽然酝酿了好久关于这次的活动&#xff0c;但是它真的发生时&#xff0c;我还是显得有些突兀和紧张…

安装Cygwin

Cygwin安装 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 下载cygwin&#xff1a;https://www.cygwin.com/ 箭头指的地方点一下就是安装该软件&#xff0c;开始要安装的一些软件&#xff0c;gcc&#xff0c;gdb&#xff0c;make&#xff0c;ssh等等。…

飞机上一般是什么操作系统?

之前波音737MAX空难失事事件牵动人心&#xff0c;让人对航空出行又平添了一份不信任&#xff0c;根据最新消息显示&#xff0c;美国联邦航空局对737 MAX机型的大量评估授权给波音公司自身进行&#xff0c;安全评估存在严重缺陷。也传出了波音737 MAX客机的培训都是通过平板电脑…

排查一个触摸屏驱动问题

今天跟同事看一个TP驱动&#xff0c;上电后日志都正常&#xff0c;但是触摸没反应&#xff0c;然后开始排查。上电后可以正常读到芯片的chip ID&#xff0c;那说明I2C是通讯正常的&#xff0c;也可以说明触摸芯片的供电也是正常的。基于这个&#xff0c;我搬来示波器&#xff0…

vmware安装ubuntu

vmware安装Ubuntu 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 &#xff08;1&#xff09; 单击”Power on this virtual machine”开始安装Ubuntu系统 经过一段时间的等待出现如下界面,单击”Install Ubuntu”进行安装 在安装的时候&#xff0…

AWS 免费套餐

https://amazonaws-china.com/cn/free/ 需要的可以看下&#xff0c;我准备搞一个RDS。 转载于:https://www.cnblogs.com/hupo376787/p/8268562.html

C++指针的应用

C指针 文章中我们介绍了指针的基本概念和应用简介。我们有提到指针可以使用在链表、队列和二叉树&#xff0c;等等。但是这些都会比较复查&#xff0c;后面"数据结构” 时&#xff0c;我们会用专门的章节来讲解这些知识。这篇文章&#xff0c;详细的探讨一下指针和其他关联…

Matplotlib——创建散点图

入门&#xff1a; 导入所用到的包 import numpy as np import matplotlib.pyplot as plt as 是对包起一个名字&#xff0c;便于后边程序的编写无颜色差别 figplt.figure() #建立一个画布 axfig.add_subplot(111) #在画布中建立图表&#xff0c;fig.add_subplot(…

vmwaretools安装

vmwaretools安装 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 vmware的作用&#xff1a;windows和linux之间文件拖文件很方便&#xff0c;但是我一般是使用samba服务器&#xff0c;后面介绍samba服务器。 &#xff08;1&#xff09;单击菜单栏上的”…

机器学习——支持向量机主要思想

概念&#xff1a;支持向量运算的分类器&#xff0c;在数据上应用基本形式的SVM分类器就可以得到低错误的结果&#xff0c;能够对训练集以外的数据点做出很好的分类决策。 名词&#xff1a; 支持向量&#xff1a;离分离超平面最近的那些点&#xff0c;需要找到最大化支持向量到分…

哇、、、、C++ 实现单向链表

之前相关的文章 C语言&#xff0c;链表 Linux内核链表 #什么是链表 链表是一种基本的数据结构&#xff0c;之前我在C语言里面写过链表的知识&#xff0c;现在延申到C&#xff0c;不管是什么语言&#xff0c;链表表示的是一种数据结构&#xff0c;跟语言没有强相关性的。 如果我…

vmware与windows共享文件夹

vmware与windows共享文件夹 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 虚拟工具安装好之后&#xff0c;我们就可以在windows和linux设置一个共享目录了,继续看图干活。 设置好共享目录以后&#xff0c;打开终端输入以下命令&#xff0c;就可以再…

asp.net如何取得纯客户端控件的值

例一&#xff1a;纯客户端控件 <input name"edisundong"type"text">在服务器端取得的方法 stringstrvalueRequest.Form.Get("edisundong");例二&#xff1a;纯客户端控件 <input type"radio"name"sex"value"…

C++ const限定符和auto类型说明符

const限定符# 1.限定常量有时我们希望定义这样的变量&#xff1a;它的值不能被改变。为了满足这一要求&#xff0c;我们使用const对变量的类型加以限定&#xff1a;const int bufSize 512;这样就把bufSize定义成了一个常量&#xff0c;它的值不能再发生变化。所以这也就意味着…

Flume框架基础

* Flume框架基础 框架简介&#xff1a; ** Flume提供一个分布式的&#xff0c;可靠的&#xff0c;对大数据量的日志进行高效收集、聚集、移动的服务&#xff0c;Flume只能在Unix环境下运行。 ** Flume基于流式架构&#xff0c;容错性强&#xff0c;也很灵活简单&#xff0c;主要…

tensorflow的安装

安装好adaconda软件&#xff0c;打开 adaconda prompt anaconda search -t conda tensorflow 查看conda create -n tensorflow python3.5 配置python3.5环境选择 yes 进行安装activate tensorflow 激活tensorflowpip install tensorflow 安装 然后打开adaco…

昨晚三巨头聚餐,顺便聊了这三个问题

今天老何找我们吃饭&#xff0c;我和老何还有老墨是邻居&#xff0c;三年前我们就认识了&#xff0c;而且关系还不错&#xff0c;但是今年疫情的原因我们都没聚过&#xff0c;上周六本来说好要聚一下&#xff0c;但又因为周末带娃的原因又没聚成&#xff0c;今天我在微信群上说…

决策树 算法原理及代码

决策树可以使用不熟悉的数据集合&#xff0c;并从中提取出一系列的规则&#xff0c;这是机器根据数据集创建规则的过程&#xff0c;就是机器学习的过程。用一个小案例分析&#xff1a;通过No surfacing 和 flippers判断该生物是否是鱼&#xff0c;No surfacing 是离开水面是否…

深度好文|面试官:进程和线程,我只问这19个问题

# 干了这碗鸡汤&#xff01;我急切地盼望着可以经历一场放纵的快乐&#xff0c;纵使巨大的悲哀将接踵而至&#xff0c;我也在所不惜。-- 太宰治 《人间失格》大家好&#xff0c;这里是周日凌晨4点&#xff0c;仍在笔耕不辍的程序喵大人。下面隆重推出我呕心沥血&#xff0c;耗时…

终于有人将进程间通信讲明白了

使用多进程协作来实现应用和系统是一种被广泛使用的开发方法。多进程协作主要有以下三点优势。将功能模块化&#xff0c;避免重复造轮子。增强模块间的隔离&#xff0c;提供更强的安全保障。提高应用的容错能力。进程间通信&#xff08;Inter-Process Communication&#xff0c…