gpt4 book ai didi

c++ - char 和 char[1] 的区别

转载 作者:IT老高 更新时间:2023-10-28 13:24:24 25 4
gpt4 key购买 nike

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

例子:

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

对于 unsigned 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

barbaz 的声明中提供的数字被 C++ 语言完全忽略。显然有人在某些时候觉得它作为一种文档形式对程序员很有用,表明函数 baz 期望它的指针参数指向一个 12 字符数组的第一个元素。

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

关于c++ - char 和 char[1] 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4120658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com