为什么我可以
char identifier[4] = {'A', 'B', 'C', 'D'};
而不是
char identifier[4];
&identifier = {'A', 'B', 'C', 'D'}; // syntax error : '{'
我为什么要这样做
char identifier[4] = "ABCD"; // ABCD\0, aren't that 5 characters??
而不是
char identifier[4];
&identifier = "ABCD"; // 'char (*)[4]' differs in levels of indirection from 'char [5]'
这是个笑话吗?
答案 0 :(得分:3)
您只能在声明数组时初始化数组。
对于char identifier[4] = "ABCD"
,这确实是可能的,但语法用于故意省略尾随的NUL字符。执行char identifier[] = "ABCD"
让编译器对字符进行计数并为您添加NUL('\0'
)。
答案 1 :(得分:2)
Arkku说了什么,但是,你也不能指定某个地址,即&x = ...
永远不合法。
答案 2 :(得分:2)
三点:
初始化不是赋值
数组不是第一类,因此无法分配。您必须单独分配元素(或使用strcpy()或memcpy()等函数。
数组的地址由数组名称提供。
在上一个示例中,以下是有效的解决方案:
char identifier[4];
memcpy(identifier, "ABCD", sizeof(identifier) ) ;
你不能在这里使用strcpy(),因为这需要一个包含5个字符的数组来允许nul终止符。有关间接级别的错误消息不是“笑话”,而是您的错误;上述代码identifier
中的注释没有&
运算符,因为这样会使char**
成为char*
。