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 数组的首地址,感觉这个是跟上面的第二个例子是没有区别的啊,应该可以正常赋值的啊,
为什么就不行了呢?求一个合理的解释。
因为数组名只是代表数组第一个元素的地址的值,比如数组 int a[10],a实际上就是 &a[0],它只是一个值,就像 5 这类东西一样,是不能作为左值的,不能给它赋值。
所谓指针只是一种保存地址的变量,单独用数组名的时候它只是数组第一个元素的地址的值,
并不是保存第一个元素地址的变量。
所以在任何时候都不能把数组名直接放在等号的左边,这个问题跟字符串什么的并没有什么关系。好像是这样的,如果有什么不对请大家指出。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。