为什么char a[]的a不能用a=“hello”来赋值?

问题

char* b里面的b是一个指向char的指针,而b可以用b=“hello”来复制。同样,a代表char数组的第一个元素的指针,类型应该也是char*,为什么b可以直接用赋值符号而a不可以呢?

回答

因为c的标准里并没有为在非初始化表达式中的这种写法增加一个额外的实现定义。所以给数组直接赋值会大概率被编译器解释为给一个常量(数组)赋值显然是不合法的。

但在变量定义阶段

char a[]=“hello”;这种写法是没问题的,数组长度和初始化方式都有明确定义。

但如果你自己写c编译器,我个人认为实现

char a[6];

a=“hello”;

这种编译器拓展应该难度不大,我暂时没发现别的问题(左值右值类型确定,长度确定,安全性问题(越界)可查,也没发现会导致什么歧义),可能有别的考虑,也可能是没啥必要懒得实现,毕竟只是一个没多大必要的语法糖。


这里面有两个问题。一个别人基本都已经说了,就是指针和数组是两种不同的类型。虽然一个数组变量可以退化(decay)成为一个指针(给别人用),但数组毕竟不是一个指针,对指针有效的赋值语句对数组就无效了。

另外一个问题实际也值得深究,就是 C 里面的数组实际上是不能相互赋值的。如果你有两个相同类型的数组,如

char a[6] = "Hello";
char b[6];

你是不能用 b = a; 来进行拷贝的。这实际上是个语言的设计问题,C 语言里作出了这样的决定,估计是怕指针的赋值和数组的赋值如果形式相同太容易发生混淆吧。比较有趣的是,如果这样的数组放在结构体里面,那就可以赋值了。

C++ 里为了向后兼容性,C 风格数组仍然跟 C 的规则相同。但是,最好知道,C++ 标准库里的 array 是可以赋值的。即下面的代码可以通过编译:

#include <array>
…
std::array<char, 6> a{"Hello"};
std::array<char, 6> b;
b = a;

这样就直观多了。要访问指针的话,则需显式写出类似 a.data() 这样的代码。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 这是因为在 C 语言中,字符串常量的末尾会自动添加一个空字符 '\',所以实际上 "Hello World" 占用了 12 个字符的空间,而数组 a 只有 12 个元素,没有空间容纳末尾的空字符,因此会报错。 ### 回答2: 在C语言中,字符数组的大小必须包含字符串结尾的空字符'\0'。当我们声明一个字符数组时,必须预留足够的空间来存储字符串中的字符以及结尾的空字符。 在给字符数组赋值时,可以使用两种方式: 1. char a[12] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\0'}; 2. char a[12] = "Hello World"; 根据你提供的代码 char a[12] = "Hello World";,编译器会自动在数组末尾添加空字符'\0'来表示字符串的结束。所以这种情况下,数组a的大小应该是13而不是12。 如果将代码修改为 char a[13] = "Hello World";,则不会报错。 ### 回答3: 在C语言中,字符数组的声明和初始化需要注意一些细节。 首先,字符数组的长度应该是字符串长度加上1,即要考虑字符串末尾的结束符'\0'。例如,如果字符串长度为11,那么字符数组的长度应为12。 其次,在C语言中,字符数组的初始化应使用单引号(' ')来表示字符,而不是双引号(" ")来表示字符串。即应该写成char a[12] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\0'}; 如果使用双引号来初始化字符数组,例如char a[12] = "Hello World";,这会导致编译器将双引号中的内容视为字符串,即会自动为字符数组添加结束符'\0',但此时字符数组的长度应该是13。 因此,对于给定的代码char a[12] = "Hello World";,它会报错是因为字符数组的长度不匹配。可以通过将数组长度修改为13来解决该问题,即char a[13] = "Hello World";。 总结来说,无论是手动初始化还是使用双引号来初始化字符数组,都需要确保字符数组的长度和字符串长度一致,并正确添加结束符'\0'。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小熊coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值