繁体   English   中英

char和char之间的区别[1]

[英]Difference between char and char[1]

在C ++中,使用char和char [1]之间有什么区别(如果有的话)。

例子:

struct SomeStruct
{
   char x;
   char y[1];
};

对于unsigned char,原因如下吗?

主要区别仅在于您用于访问一个char的语法。

通过“访问”我的意思是,使用语言中的各种运算符对其进行操作,与char数组相比,当应用于char时,大多数或所有运算符都执行不同的操作。 这使得听起来好像xy几乎完全不同。 如果事实上它们都“由”一个字符组成,但该字符以非常不同的方式表示。

实现可能会导致其他差异,例如,它可能根据您使用的不同而对齐和填充结构。 但我怀疑它会。

运算符差异的一个示例是char是可分配的,而数组不是:

SomeStruct a;
a.x = 'a';
a.y[0] = 'a';
SomeStruct b;
b.x = a.x; // OK
b.y = a.y; // not OK
b.y[0] = a.y[0]; // OK

y不可分配的事实并不能阻止SomeStruct被赋值:

b = a; // OK

所有这些都与类型无关,不管是不是char 类型的对象和大小为1的那种类型的数组在内存中几乎是相同的。

顺便说一句,有一个上下文,它会使你从charchar[1] “使用”产生很大的不同,这有时会让人误以为数组是真正的指针。 不是你的例子,而是作为一个函数参数:

void foo(char c);     // a function which takes a char as a parameter
void bar(char c[1]);  // a function which takes a char* as a parameter
void baz(char c[12]); // also a function which takes a char* as a parameter

C ++语言完全忽略了barbaz声明中提供的数字。 显然有人在某种程度上认为程序员作为一种文档形式会很有用,这表明函数baz期望它的指针参数指向12 char数组的第一个元素。

在bar和baz中, c从不具有数组类型 - 它看起来像数组类型,但它不是,它只是一个奇特的特殊情况语法,其含义与char *c相同。 这就是为什么我把引号放在“使用”上 - 你根本就没有使用char[1] ,它只是看起来像它。

如果你实际上已经看到构造char y[1]作为生产代码中结构的最后一个成员,那么你很可能遇到了struct hack的一个实例。

这个短阵列是一个真实但可变长度阵列的替身(回想一下,在c99之前,c标准中​​没有这样的东西)。 程序员总是会在堆上分配这样的结构,注意确保分配足够大,以满足他想要使用的数组的实际大小。

除了Steve强调的使用中的符号差异外,char [1]可以传递给例如template <int N> void f(char(&a)[N]) ,其中char x = '\\0'; f(&x); char x = '\\0'; f(&x); 不匹配。 可靠地捕获数组参数的大小非常方便且令人放心。

它也可能暗示不同的东西:要么实际长度可能更长(由dmckee解释),要么内容在逻辑上是ASCIIZ字符串(在这种情况下恰好是空的),或者字符数组(发生的情况)有一个元素)。 如果结构是几个相关结构之一(例如,数组向量,其中数组大小是模板参数,或者是某些I / O操作所需的内存布局的编码),则完全可能与其他字段有某些相似性数组可能较大的地方会建议偏好单字符数组,从而使支持代码更简单和/或更普遍适用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM