C 语言里为什么这样初始化字符串是错误的?

C语言里的字符串实际上就是char组成的数组,所以
#include
intmain(void){
charstr[4]="abc";
for(size_ti=0;i<3;i++){
printf("%c\n",str[i]);
}
return0;
}
是可行的,正常输出没啥问题。
因为双引号""括起来的字符串实际上返回的是这个字符串第一个字符的地址,所以
#include
intmain(void){
char*str;
str="abc";//把这个字符串的首地址赋给str
for(size_ti=0;i<3;i++){
printf("%c\n",str[i]);
}
return0;
}
也是可行的。
但是为什么:
#include
intmain(void){
charstr[4];
str="abc";
for(size_ti=0;i<3;i++){
printf("%c\n",str[i]);
}
return0;
}
就不行了呢?在我的电脑上报错:
error:arraytype'char[4]'isnotassignable
str="abc";
照常理来说,声明了charstr[4],那么str就代表了这个char数组的首地址。
而按照上面第二个例子,"abc"返回的就是这个char数组的首地址,感觉这个是跟上面的第二个例子是没有区别的啊,应该可以正常赋值的啊,为什么就不行了呢?求一个合理的解释。
30秒到达战场
浏览 887回答 2
2回答

一只斗牛犬

刚才突然想明白了。因为数组名只是代表数组第一个元素的地址的值,比如数组inta[10],a实际上就是&a[0],它只是一个值,就像5这类东西一样,是不能作为左值的,不能给它赋值。所谓指针只是一种保存地址的变量,单独用数组名的时候它只是数组第一个元素的地址的值,并不是保存第一个元素地址的变量。所以在任何时候都不能把数组名直接放在等号的左边,这个问题跟字符串什么的并没有什么关系。好像是这样的,如果有什么不对请大家指出。

开心每一天1111

第一种charstr[4]="abc";这一种的含义是,分配一个char的数组(有四个元素),'a'放进str[0],'b'放进str[1],'c'放进str[2],'\0'放进str[3]第二种char*str;str="abc";这是声明一个char型指针变量str,然后创建一个字符串常量"abc",然后char指针str指向这个常量的内存,其实你可以试试,你可以通过str输出这个字符串(可以读),但是不能更改它(不能写)第三种charstr[4];str="abc";这种是有语法错误的,先声明一个char数组str[4],这时候str[4]有一块内存,而str作为数组名,相当于一个指针常量,固定指向str[4]这个数组的第一个元素的地址。而你使用str="abc",相当于想要给一个指针常量赋值,所以显然是有语法错误的。想想你对一个常量赋值,当然会有错误!!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript