D是错的,图片中的下面也有文字说明。下面看看我的详细解释:A选项:char *ch; ch="abc"; //ch是个指针,"abc"是一个字符串常量,常量是在内存中开辟的一个空间保存的,这个空间是只读的。语句中把ch指针指向这个常量的赋值是完全正确的。下面一段代码演示"abc"是只读常量:void main(){char *ch; ch="abc";*ch='d'; //程序可以编译链接通过,但是运行到这里程序会非法操作,出现系统提示,内存只能读}B选项:char ch[]={'a','b','c'}; //这样赋值也没错,程序也能编译通过,但是你只能把ch当一个字符数组使用,而不能把它当字符串来使用,因为字符串必须用0结尾,你硬是要把它当字符串用,行,但是会出现很多不可意料的事情,比如printf(ch);屏幕上就可能出现:abc后面一堆其它的东西。这个选项错,是因为题目是问“能给字符串正确赋值”的语句,准确说这是给字符数组赋值而非字符串赋值。C选项:char ch[3]="abc";//这是字符串赋值语句,在B中也说了,字符串必须0结尾,但是空间只有3,放入了abc再放不下0了,空间不够,编译就不会通过,所以错了,char ch[4]="abc";就没问题。D选项:char ch[4];ch="abc";//ch空间够了,但是这是2条语句,char ch[4];已经开辟了空间,ch指向这个大小为4的空间,ch可以理解为一个指针,这个指针和这个4字节的空间捆绑在一起的,对应关系。ch="abc";同A要把这个指针重新指到另外一个字符串常量,那原先4字节空间就无主了,这编译怎么能让你通过。这是比较通俗的解释。正规的解释是:ch[4]是一个字符数组,字符串常量是不可以这样直接赋值给字符数组。除非是char ch[4]; strcpy(ch,"abc");这样拷贝过去才没问题。解释不好,有问题可追问,谢谢采纳
A选项给指针变量可以直接赋值,过程为将abc\0存入内存中,再返回这段字符串的地址。 追答 而数组则不能整个这么赋值。你可以试试&ch="abc" &ch[0] 初始化的时候直接赋值倒是可以。后面赋值可以用strcat strcpy函数