C 语言里为什么这样初始化字符串是错误的?
C 语言里的字符串实际上就是 char 组成的数组,所以
#include <stdio.h>
int main(void) {
char str[4] = "abc";
for (size_t i = 0; i < 3; i++) {
printf("%c\n", str[i]);
}
return 0;
}
是可行的,正常输出没啥问题。
因为双引号""
括起来的字符串实际上返回的是这个字符串第一个字符的地址,所以
#include <stdio.h>
int main(void) {
char *str;
str = "abc"; // 把这个字符串的首地址赋给 str
for (size_t i = 0; i < 3; i++) {
printf("%c\n", str[i]);
}
return 0;
}
也是可行的。
但是为什么:
#include <stdio.h>
int main(void) {
char str[4];
str = "abc";
for (size_t i = 0; i < 3; i++) {
printf("%c\n", str[i]);
}
return 0;
}
就不行了呢?在我的电脑上报错:
error: array type 'char [4]' is not assignable
str = "abc";
照常理来说,声明了 char str[4]
,那么 str
就代表了这个 char 数组的首地址。
而按照上面第二个例子,"abc" 返回的就是这个 char 数组的首地址,感觉这个是跟上面的第二个例子是没有区别的啊,应该可以正常赋值的啊,
为什么就不行了呢?求一个合理的解释。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
刚才突然想明白了。
因为数组名只是代表数组第一个元素的地址的值,比如数组
int a[10]
,a
实际上就是&a[0]
,它只是一个值,就像5
这类东西一样,是不能作为左值的,不能给它赋值。所谓指针只是一种保存地址的变量,单独用数组名的时候它只是数组第一个元素的地址的值,
并不是保存第一个元素地址的变量。
所以在任何时候都不能把数组名直接放在等号的左边,这个问题跟字符串什么的并没有什么关系。好像是这样的,如果有什么不对请大家指出。
第一种
这一种的含义是,分配一个char的数组(有四个元素),'a'放进str[0],'b'放进str[1],'c'放进str[2],'\0'放进str[3]
第二种
这是声明一个
char型指针变量 str
,然后创建一个字符串常量"abc",然后char指针 str 指向这个常量的内存,其实你可以试试,你可以通过str输出这个字符串(可以读),但是不能更改它(不能写)第三种
这种是有语法错误的,先声明一个char数组str[4],这时候str[4]有一块内存,而
str作为数组名,相当于一个指针常量
,固定指向str[4]这个数组的第一个元素的地址。而你使用str="abc",相当于想要给一个指针常量赋值,所以显然是有语法错误的。想想你对一个常量赋值,当然会有错误!!
char[]
和char *
类型是不一样的,一个是数组类型,一个是指针类型。char str[]
中,str通常是数组首地址指针,并且不能修改。为什么呢?假如str改变了,那么意味着没有任何指针再指向那段内存,此时内存泄露!!而字符串常量"123"是有自己有地址的,类型为
char *
,尝试将char *
赋给char[]
是不允许的。这个问题其实没那么纠结,你直接写成char str[4] = "abc";不就OK了吗?
对于错误的提示信息是说不能对数组赋值,比如 int a[5]={1,2,3,4,5},int b[5]={5,4,3,2,1}
不能a=b,这样时错误的,如果你想让a中拥有b中的元素的话。
如果你这么写代码的话提示的错误信息应该和你一样。
int a[5]={1,2,3,4,5};
int b[5]={5,4,3,2,1};
a=b;
main.cpp:86:6: error: array type 'int [8]' is not assignable
@fordoo 在第二点里说的你是犯的一个错误,数组名是数组首地址,必须不能修改,淡然指针就可以,你在上面的代码中友提到。
希望能帮到你。
这样的,char a[10]=“88888”; a是一个地址,这个字符串的首地址,可以把他理解为一个指针。但是,它是一个指向自己且只能指向自己的。是一个带路的,我要字符串中哪个字符,a可以带我去。
而 char b[10]="8888"; b是一个指针,我可以指向任何一个地址。因为我是一个指路的,并不是一个带路的。我要到字符串哪个地方去,b会给我指路,告诉我就在那里。
array type 'char [4]' is not assignable
这不写着 不能对数组赋值吗
不是应该是是*str = "abc";这样吗,我记得C primer plus里面有讲过这种问题
请去复习下c语言数组部分吧,数组其实就相当于const的指针,const指针怎么可能赋值呢