3
1.char str[] = "hello"; //legal  

2.char str1[];
str1 = "hello"; // illegal

我知道“hello”从字符串文字池中返回字符串文字的地址,该地址不能直接分配给数组变量。在第一种情况下,“hello”文字中的字符被一个接一个地复制到数组中,并在末尾添加一个 '\0'。

这是因为赋值运算符“=”在这里被重载以支持这一点吗?

我还想知道其他有趣的案例,其中初始化与赋值不同。

4

4 回答 4

4

不能将其视为重载(无论如何在 C 中都不存在),因为使用字符串文字初始化 char 数组是一种特殊情况。字符串文字的类型是const char[N],因此如果它类似于重载,您将能够使用任何类型为 的表达式来初始化 char 数组const char[N]。但你不能!

const char arr[3];
const char arr1[] = arr; //compiler error. Cannot initialize array with another array.

语言标准只是说字符数组可以用字符串字面量初始化。由于他们对赋值只字未提,因此一般规则特别适用于不能分配数组。

至于初始化与赋值不同的其他情况:在 C++ 中,有引用和类,会有无数的例子。在 C 中,没有成熟的类或引用,我唯一能想到的另一件事是 const 变量:

const int a = 4; //OK;
const int b; //Error;
b = 4; //Error;

另一个例子:用大括号初始化数组

int a[3] = {1,2,3}; //OK
int b[3];
b = {1,2,3}; //error

与结构相同

于 2013-07-06T08:21:55.717 回答
3

如果您想将其视为重载的运算符(即使 C 不使用该术语),您当然可以这样做。

您是否也认为这是重载:

unsigned char x;
double y;

x = 2;
y = 1.243;

毕竟,它们分配了完全不同类型的数据,但是使用“相同的运算符”,对吗?

只是不同,是初始化还是分配。

另一个很大的区别是您曾经能够初始化结构,但没有对应的“结构文字”语法用于以后的分配。从 C99 开始,这不再适用,我们现在有了复合文字

于 2013-07-06T08:05:18.073 回答
1
char str[] = "hello";

是数组初始化,使用 C 中定义的语法糖,因为字符串初始化是如此普遍。编译器在您的程序中分配一些固定内存并对其进行初始化。数组的名称 (str) 计算为该内存的地址,并且它不能更改,因为没有保存该地址的变量。

Grijesh Chauhan 解释了更多细节。

其他情况取决于您的意思。扩展当前案例,可以很容易看到其他初始化的数组也有相同的属性,例如

int a[] = { 1, 2, 3, 4 };
于 2013-07-06T08:36:48.793 回答
0

数组具有不可修改的地址。您需要一个指针作为可修改的左值。

通过分配(尝试)给一个常量字符串文字,您正在获取它的地址。不同的地址导致了这种非法性。

“你好”在内存中分配一些空间并给出地址。然后你用它的地址来初始化数组。

于 2013-07-06T08:04:45.547 回答