在unsigned char数组和c ++中的char数组中,NULL(或0或'\ 0')值是否有不同的解释?

时间:2013-10-24 01:50:10

标签: c++ pointers null char unsigned-char

NULL(或0或'\ 0')在unsigned char数组和char数组中的表现如何?在char数组中,NULL确定char数组的结尾。是否与unsigned char数组相同?如果不是,我们如何确定unsigned char数组的结束?

2 个答案:

答案 0 :(得分:3)

NULL的确切定义是实现定义的;所有这一切都得到保证,它是一个扩展为空指针常量的宏。反过来,空指针常量是“整数类型的整数常量表达式(5.19)prvalue,其计算结果为零或者std::nullptr_t的prvalue”。它可能会或可能不会转换为charunsigned char;它应该只与指针一起使用。

0int类型的文字,其值为零。 '\0'是char类型的文字,其值为零。要么可以隐式转换为unsigned char,要么产生零值。

纯粹是一种惯例,C和C ++中的字符串通常表示为以{0}结尾的char s序列。没有什么可以阻止您声明不遵循此约定的char数组:

char embedded_zero[] = {'a', '\0', 'b'};

当然,期望其参数遵循约定的函数将停在第一个零点:strlen(embedded_zero) == 1;

当然,您可以编写一个采用unsigned char*并遵循类似约定的函数,要求调用者使用零值的元素指示序列的结尾。或者,您可以编写一个函数,该函数采用指示序列长度的第二个参数。您决定哪种方法更适合您的设计。

答案 1 :(得分:2)

严格地说,'\0'表示字符串文字的结尾,而不是任何char数组的结尾。例如,如果声明一个数组而不将其初始化为字符串文字,则其中不会有结束标记。

但是,如果使用字符串文字初始化unsigned char的数组,则会获得与常规字符数组中相同的'\0'结束标记。换句话说,在下面的代码中

char s[] = "abc";
unsigned char u[] = "abc";

s[3]u[3]包含相同的'\0'值。