为了账号安全,请及时绑定邮箱和手机立即绑定

139、以下选项中,不能正确赋值的是

139、以下选项中,不能正确赋值的是

C
包小龙虾 2018-08-23 16:44:31
139、以下选项中,不能正确赋值的是 A) char s1[10];s1="Ctest";B) char s2[]={'C', 't', 'e', 's', 't'}; C) char s3[20]="Ctest"; D) char *s4="Ctest\n";
查看完整描述

2 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

B 选项你应该懂的,对吧。  这就是简单的用“初始化列表”来初始化数组。

但我要提醒下:这个 s2 只是个“字符数组”,不能当作字符串。因为 s2 中只有这 5 个字符,没有结尾的 '\0',无法构成 C 语言中定义的字符串。  s2 作为一个字符数组当然是合法的,这没问题。


你还记得我在 35 题(https://www.imooc.com/wenda/detail/412699)中提到“字符串字面量可以用来初始化字符数组”吧。  所以 C 选项是没问题的。


数组本身是不能被直接赋值的! 也就是你不能像这样 s1 = s2 把另一个数组 s2 赋值给 s1 数组。

你应该记得“字符串字面量”就是数组,所以 s1="Ctest" 是不正确的。 其实这里发生的事要更复杂些:这里右侧的字符串字面量同样会隐式转换为指向首元素的指针,就是说实际上 s1 是在被试图用 char 指针赋值。而 s1 是数组,根本就不能被赋值。

所以 A 选项是错的。

也许你觉得 s1="Ctest" 看起来和 C 选项差不多啊。但关键区别就是:只能在定义数组并初始化时这样做(参考 C 选项中的解说)


D 选项嘛,你应该能够自己推导了。 等号右侧还是会转换为“指向首元素的指针”,也就是字符指针类型,刚好可以为 s4 作初值。 

还要提醒下:字符串字面量是不可修改的,那么你不能通过指向它的字符指针 s4 来修改这个字符串中的字符。  如果你这样做了,程序在运行到此时通常会出错退出(大概率直接崩溃掉)


顺便提一下:前面那个回答不太正确,s1 是数组没错。

顺便再黑一下题库:这个题目也不严谨,应该说除了 A 选项是“赋值”外,其余 BCD 都是“初始化”

查看完整回答
反对 回复 2018-08-24
?
Glitterior

TA贡献27条经验 获得超8个赞

A.s1是指针,"Ctest"是字符串,不能赋值

查看完整回答
反对 回复 2018-08-23
  • 2 回答
  • 1 关注
  • 3928 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信