char和char的区别
在C ++中使用char和char [1]之间有什么区别(如果有的话)。
例子:
struct SomeStruct { char x; char y[1]; };
对于unsigned char是否遵循相同的原因?
主要区别在于您用来访问您的一个字符的语法。
通过“访问”,我的意思是,使用语言中的各种操作符对其进行操作,其中大部分或全部应用于char
与char
数组相比会做不同的事情。 这听起来好像x
和y
几乎完全不同。 如果事实上它们都是“由”一个字符组成的,但是这个字符已经以非常不同的方式performance出来了。
这个实现可能会导致其他的不同,比如它可以根据你使用哪一个来alignment和填充结构。 但我怀疑是否会。
运算符差异的一个例子是char是可赋值的,而数组不是:
SomeStruct a; ax = 'a'; ay[0] = 'a'; SomeStruct b; bx = ax; // OK by = ay; // not OK by[0] = ay[0]; // OK
但是y
不可分配的事实并不能阻止SomeStruct
被赋值:
b = a; // OK
所有这一切都是无论types, char
或不。 一个types的对象和一个大小为1的types的数组在内存中的内容几乎相同。
另外,还有一个背景,它使用了char
和char[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
在bar
和baz
的声明中提供的数字完全被C ++语言忽略。 显然有人在某种程度上认为程序员作为一种文档forms是有用的,表明函数baz
期望它的指针参数指向12个char数组的第一个元素。
在bar和baz中, c
永远不会有数组types – 它看起来像一个数组types,但它不是,它只是一个与char *c
相同的奇特的特殊情况语法。 这就是为什么我把引号放在“use”上 – 你根本就没有使用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所解释的),或者内容在逻辑上是一个ASCIIZstring(在这种情况下恰好为空),或者是一个字符数组有一个元素)。 如果结构是几个相关结构中的一个(例如,数组大小是模板参数的math向量,或者某些I / O操作所需的内存布局的编码),那么完全有可能与其他字段数组可能更大的地方会build议优先使用单字符数组,从而允许支持代码更简单和/或更普遍适用。