1.char str[] = "hello"; //legal
2.char str1[];
str1 = "hello"; // illegal
我理解“hello”返回字符串字面量池中的地址,不能直接分配给数组变量。在第一种情况下,“hello”字面量中的字符一个接一个地复制到数组中,末尾加上‘\0’。
这是因为赋值运算符“=”在此处被重载以支持此操作吗?
我还想知道其他有趣的情况,其中初始化与赋值不同。
1.char str[] = "hello"; //legal
2.char str1[];
str1 = "hello"; // illegal
你不能认为这是重载(在C语言中并不存在),因为使用字符串字面值初始化字符数组是一种特殊情况。 字符串字面值的类型是const char[N]
,所以如果它类似于重载,你应该能够使用任何类型为const char[N]
的表达式来初始化字符数组。 但是你不行!
const char arr[3];
const char arr1[] = arr; //compiler error. Cannot initialize array with another array.
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
unsigned char x;
double y;
x = 2;
y = 1.243;
毕竟,它们分配完全不同类型的数据,但使用“相同的运算符”,对吗?
初始化或分配只是不同。
另一个重要的区别是,您过去可以初始化结构,但是没有相应的“结构字面量”语法供以后分配使用。从C99开始,我们现在有复合字面量。
struct
是另一个类似的例子:struct x { int a; char c; } a = {1, '1'};
是有效的,但之后你不能执行 a = {2, '1'};
。 - Grijesh Chauhana = ((struct x) { 2, 'a' });
。 - unwindint a[]= {1,2,3}
然后在我的代码中使用a = (int[3]){3,2,1};
在c99中吗? - Grijesh Chauhanchar str[] = "hello";
int a[] = { 1, 2, 3, 4 };
数组具有不可修改的地址。您需要一个指针作为可修改的lvalue。
通过分配(尝试)常量字符串文字,您正在获取其地址。不同的地址导致违法。
“hello”在内存中分配了一些空间并给出了一个地址。然后您取其地址来初始化数组。
char str1[];
也是不合法的。 - banarun