char name[25];
name[] = "abcd";
上面的代码给了我表达式语法错误。
char name[25];
name = "abcd";
上面的代码给了我一个Lvalue Required错误。
但是以下代码没有错误:
char name[25] = "abcd";
有人可以解释吗?
答案 0 :(得分:3)
char name[25]
(数组的声明)执行此操作:
name
声明为指向该内存的字符数组(几乎但并不完全类似于char *
)。 char name[25] = "abcd"
(带有初始化程序的数组的声明)执行此操作:
"abcd\0"
name
声明为指向该内存的字符数组(几乎但并不完全类似于char *
)。(name[] = "abcd"
的情况不是C支持的语法。)
在这两种情况下,指针和数组之间的关键区别之一是指针的目标可以更改。数组的目标不能。即您永远不能为上面声明为name
的{{1}}分配任何内容,但是可以按照以下方式分配给声明为char[]
的{{1}}。 name
(指针的声明,将文字字符数组分配给指针)执行以下操作:
char *
char *name; name = "abcd"
声明为指向未定义目标的字符(几乎但不完全类似于"abcd\0"
)的指针name
占用的内存地址分配给变量char[]
。答案 1 :(得分:3)
如果根据需要放置分号,则此构造
char name[25]; name[]="abcd";
可能会被重写以提高可见性,例如
char name[25];
name[]="abcd";
所以我看到在第二行中我们没有类型说明符,该行将是有效的声明
char name[25];
char name[]="abcd";
在这一行中,再次缺少第二个标识符的类型说明符
char name[25]; name ="abcd"
我们将像这样重写
char name[25];
char name ="abcd";
然后name
的类型为char
,但它是由字符串文字而不是一个字符初始化的。因此很明显name应该是一个数组或一个指向char的指针,例如
char name[25];
char name[] ="abcd";
或
char name[25];
char *name ="abcd";
或者例如
char name[25];
char name[26] ="abcd";
当然,标识符的名称应该不同。否则,由于在相同范围内重新定义了相同的标识符名称,编译器将再次发出错误。