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

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";

包小龙虾
浏览 4065回答 2
2回答

onemoo

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 都是“初始化”

Glitterior

A.s1是指针,"Ctest"是字符串,不能赋值
打开App,查看更多内容
随时随地看视频慕课网APP