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

标签 c++ pointers null char unsigned-char

NULL(或 0 或“\0”)在无符号字符数组和字符数组中如何表现?在 char 数组中,NULL 确定 char 数组的结尾。 unsigned char 数组的情况是否相同?如果不是,我们如何确定 unsigned char 数组的结尾?

最佳答案

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

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

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

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

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

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

关于c++ - NULL(或 0 或 '\0' )值在 c++ 中的 unsigned char 数组和 char 数组中的解释是否不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19555481/

相关文章:

c++ - 为什么禁止在后续的私有(private)派生类中简单提及基指针/引用?

C++ 指针在使用之前被引用

c++ - 接收到一个字符串 "chars"并尝试使用指针计算其中有多少个是同类的

f# - 强制 F# 类型的字段为空

ms-access - 用户如何在MS Access中插入空值?

c++ - 我们如何在我们的 C++ 代码中使用任何 C 库?

c++ - iterator_category 和 decltype

C++ ostream 使用模板隐式删除

java - 在定义到方法中的类上使用 Gson 返回 null

c++ - 如何从多个 IP 数据包重建 TCP 流?