初始化与赋值不同?

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

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

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

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

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

 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 

与结构相同

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

你还认为这是重载:

 unsigned char x; double y; x = 2; y = 1.243; 

毕竟,那些分配完全不同类型的数据,但使用“相同的运算符”,对吧?

它只是初始化或分配不同。

另一个很大的区别是你曾经能够初始化结构,但是后来的赋值没有相应的“struct literal”语法。 从C99开始,这已不再适用,我们现在有了复合文字 。

 char str[] = "hello"; 

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

Grijesh Chauhan解释了更多细节。

其他情况取决于你的意思。 例如,扩展当前案例,您可以轻松地看到其他已初始化的数组具有相同的属性

 int a[] = { 1, 2, 3, 4 }; 

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

通过分配(尝试)一个不变的字符串文字,你将获取它的地址。 不同的地址导致非法。

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