在C/C++语言中我们经常看到’\0’、NULL。从概念上看两者完全不同,但是本质上他们都可以用数值0来表示。空指针是指针类型,而空字符是整形类型,两者有时很容易混淆。
NULL
空指针有一个值,该值不会与任何数据的有效值地址对应。通常,函数使用它返回一个有效地址表示某些特殊情况的发生,例如遇到文件结尾或未能按预期执行。
空指针是一个地址,通常占4个字节;通过一个例子测试空指针(NULL)是数值0来表示。
#include <stdio.h>int main(int argc, char const *argv[])
{int value = NULL;printf("value = %d\n",value );return 0;
}
输出结果
实际上NULL通常是如下定义:
#define NULL (void*)0
验证了编译时候输出结果为0;
’\0’
空字符(’\0’)是用于标记C字符串结尾的字符。其对应的字符编码是0。
测试‘’\0’是否是数值0
#include <stdio.h>int main(int argc, char const *argv[])
{int num = '\0';printf("num = %d\n",num );return 0;
}
输出结果
输出结果验证了’\0’是数值0;
因为每个字符串都以空字符结尾,所以不同给函数传递字符串大小,函数依次处理每个字符,直到遇到空字符。
常常会看到下面这样的指针表示写法
const char *str;
while (*str != '\0')putchar(*str++);
或者数组表示写法
int i = 0;
char str[128];
while (str[i] != '\0')putchar(str[i++]);
我们常见的C库函数strcat,strcmp,strcpy,都是遇到’\0’结束的。
"\0"与"0"
其实两者没有区别,用双引号" "都是字符串。字符串是以’\0’为结尾。
用sizeof和strlen测试字符串大小。
#include <stdio.h>
#include <string.h> //strlen
int main(int argc, char const *argv[])
{char str1[] = "\0";char str2[] = "0";printf("sizeof str1 = %d, strlen str1 = %d\n",sizeof(str1),strlen(str1));printf("sizeof str2 = %d, strlen str2 = %d\n",sizeof(str2),strlen(str2));return 0;
}
输出结果
编译结果可以看出,sizeof计算字符串"0"后面是带有’\0’所以数值为2,而使用strlen计算字符串’\0’长度为0;

扫二维码关注微信公众号,获取技术干货
















