C/C++语言中NULL、'\0’和0的区别
注:本文参考了http://blog.csdn.net/mylinx/article/details/6873253及书籍《征服C指针》([日]前桥和弥著)。
NULL、'\0'和0的值是一样的,都是0,不过它们的表现形式不一样:
1. NULL: 即空指针,不过在C和C++中并不一样。在VS 2013的库文件string.h中可以看到如果定义。
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else /* __cplusplus */
#define NULL ((void *)0)
#endif /* __cplusplus */
#endif /* NULL */
可以看出,在C中,NULL表示的是指向0的指针,而在C++中,NULL就直接跟0一样了。但有一点值得注意的是:在C语言中,“当常量0处于应该作为指针使用的上下文中时,它就作为空指针使用”(《征服C指针》)。例如,下边的指针定义和初始化是没问题的(即没警告也没报错):
int * p = ; /* C language */
但如果定义成如下的样子呢?
int * p = ; /* C language */
很明显,这样子做是有问题的。这一句可以编译通过,但在VS 2013中有这样的警告:“warning C4047: “初始化”:“int *”与“int”的间接级别不同”。
我又试了一下这一句在C++中的情况,VS 2013就直接报错了:“ ‘int’ 类型的值不能用于初始化 ‘int *’ 类型的实体”。
因此,为了防止混淆,在C/C++中,当要将一个指针赋值为空指针的时候,都应该将它赋为NULL,而不是0。
2. ‘\0’:‘\0’是一个“空字符”常量,它表示一个字符串的结束,它的ASCII码值为0。注意它与空格' '(ASCII码值为32)及'0'(ASCII码值为48)不一样的。
在《征服C指针》中,作者还提到了一种错误的程序写法:使用NULL来结束字符串。例如下边的程序就是有问题的:
char str[] = { '', '', '', NULL }; /* C language */
在VS 2013中,会的这样的警告:“warning C4047: “初始化”:“char”与“void *”的间接级别不同”。而在C++中,这一句是没有问题的。
还有一点值得注意,如下的程序在C/C++中都是没有问题的:
char str[] = { '', '', '', }; / C/C++ language */
但为了防止混淆,在C/C++中,当要给一个字符串添加结束标志时,都应该用‘\0’而不是NULL或0。
综上所述,当我们要置一个指针为空时,应该用NULL,当我们要给一个字符串添加结束标志时,应该用‘\0’。
C/C++语言中NULL、'\0’和0的区别的更多相关文章
- 在java语言中int 和 Integer 有什么区别
在java语言中int 和 Integer 有什么区别 解答:int是基本数据类型,Integer是int的包装类,属于引用类型
- C语言中NULL的定义
用C语言编程不能不说指针,说道指针又不能不提NULL,那么NULL究竟是个什么东西呢? C语言中又定义,定义如下: #undef NULL #if defined(__cplusplus) #defi ...
- c语言中:strlen和sizeof的区别和它们分别交换各自作用领域(\0问题)时的细微差别!!!
本人c语言初学菜鸟一枚,今天通过敲了一段简单代码,发现strlen和sizeof之间的一些关系,总结如下: 用strlen计算数组长度要考虑进去\0 用sizeof计算字符串长度也要考虑进去\0 而s ...
- Java语言中null与" "的区别
null是空对象,没有地址,可以赋值给任何对象:""是空字符串,有地址但是里面的内容是空的,只能赋值给字符串对象. 如:String s;//分配了一个内存空间,没存入任何对象 ...
- C语言中,#include <>和#include ""的区别和注意点
C语言中包含文件有两种包含符号,一个是<>尖括号,另一个是""双引号.那么这两个有什么区别呢? 首先在本地建立一个空文件,命名为stdio.h. 然后再建立一个C文件, ...
- c语言中 char* 和 unsigned char* 的区别浅析(转)
原文:https://blog.csdn.net/guotianqing/article/details/77341657 背景最近在项目中遇到了一个编译警告,是因为定义的变量为char[],而在使用 ...
- C语言中 if 和 else if 的区别
先看代码:我们本意是对i不同的值有不同的判断. #include<stdio.h> int main(void) { ; ) { i++; printf("%d\n", ...
- C 语言中char* 和const char*的区别
const char *p = "123"; p[1] = '3'; // 会报错p = "456"; // 不会报错 const char * 只是说指针指向 ...
- C语言中的typedef跟define的区别
今天用C语言练习时涉及到了typedef和define的使用问题,那么他们的区别是啥?这种情况下为什么要用typedef?哪种情况下为什么要用define呢? 学习C的时候的你是否考虑过这个问题呢? ...
随机推荐
- Core Python Programming一书中关于深浅拷贝的错误
该书关于深浅拷贝的论述: 6.20. *Copying Python Objects and Shallow and Deep Copies "when shallow copies are ...
- 27 自定义View 和案例
有时安卓提供的View不满足我们的需求时可以创建一个类继承View或其子类重写方法 如 package com.qf.sxy.day28_customview.view; import android ...
- Hive-ORC文件存储格式(续)
本文在Hive-ORC文件存储格式的理论基础上,进一步分析一个实际的Hive ORC表中的数据存储形式. 一.表结构 库名+表名:fileformat.test_orc 字段 类型 category_ ...
- Linux下的一些常用命令(一)
在Linux环境下敲各种命令是再正常不过了,尤其是现在大多少服务器均为Linux系统,但是我又记不住这么多命令,只是偶尔在项目做完发布到服务器上的时候会涉及到,所以在网上找了一些命令,在此记录一下~ ...
- ORACLE时间日期格式使用总结(参考网上资料汇总)
Oracle时间日期操作 sysdate+(5/24/60/60) 在系统时间基础上延迟5秒 sysdate+5/24/60 在系统时间基础上延迟5分钟 sysdate+5/24 在系统时间基础上延迟 ...
- Afinal加载网络图片及下载文件使用方法
Afinal快速开发框架使用起来非常方便,下面将讲解如何利用Afinal加载网络图片及下载文件: 先看效果图: 注意:使用Afinal前需添加Afinal的jar,可以在这里下载:http://dow ...
- Android实现系统下拉栏的消息提示——Notification
Android实现系统下拉栏的消息提示--Notification 系统默认样式 默认通知(通用) 效果图 按钮 <Button android:layout_width="match ...
- AMH 5.X下安装 Flarum
如果移动端访问不佳,请尝试–>Github版 背景 最近无意间发现几个开源软件的Bug反馈系统使用的是Flarum,Flarum是一款优雅简洁论坛软件,看起来还是相当不错的,一时抑制不住想要尝试 ...
- Android之使用参数改变ProgressDialog的位置、大小、背景透明度、屏幕透明度
废话不多说,这个改变ProgressDialog的一些配置属性和前面我讲的AlertDialog的设置参数方法一模一样,这里就为了更直观,直接贴实现代码吧: ProgressDialog mProgr ...
- 【一天一道LeetCode】#290. Word Pattern
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...