首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

c语言赋值小疑点

2012-10-18 
c语言赋值小问题设char ch,str[4],*strp,则下列赋值语句正确的是( )。【答  案】C【分  数】1分【选  项】 A、ch

c语言赋值小问题
设char ch,str[4],*strp;,则下列赋值语句正确的是( )。
【答  案】C
【分  数】1分
【选  项】 A、ch="CBA"; B、str="CBA"; C、strp="CBA"; D、*strp="CBA";

请解释下为什么是c正确呢?

[解决办法]
ch是一个字符,str[4]是一个字符数组,strp是一个指向字符串的地址。 A显然不对,ch只能赋一个字符;B
中,应用strcpy(str, “CBA"); C是正确的,strp是一个地址,这样赋值相当与strp指向“CBA”的首地址;D是错误的,*strp是具体指向的一个字符。
[解决办法]
B str="CBA"; 干扰项 str[4]="CBA" str表示&str[0]
[解决办法]
把类型理一下就知道了. 

C/C++ code
ch //char, 变量(可以用char修改)str //数组,有4个元素(类型为char), 常量strp //字符指针, char*, 变量,(可以用char*修改)"ABC" //这个表达式的类型为char [4], 可以隐式转换为char*
[解决办法]
C虽然正确,但却是一个颇为怪异的编译器行为,因为这个char*连内存都还没分配居然就可以存储字符,这个你记得这个特例就行了,仅此一例,也就是说,下面这种用法正确:
char *str="abcdefg";
这样赋值之后str的内容是不能更改的,也就是说如果在此后面下面的语句将通不过编译:
str[3]='m';
因为它尝试修改str的内容,换句话说,在经过前面那个赋值之后,str实际上是 const char *。
[解决办法]
C/C++ code
char str[4];str = "CBA";//不行, 类型不匹配.char str[4]="CBA";//可以, 初始化相当于 {'C', 'B', 'A', '\0'}//也可以这样:char str[4];strcpy(str, "ABC"); //同样把“ABC”赋值给字符数组str;
[解决办法]
char ch;//ch是字符,赋值要用'',如:ch='a'
char str[4];//str是字符串,str="CBA",类型不匹配,可以用strcpy赋值,但是要包含string.h的头文件
char *strp;//strp是字符变量的地址,strp="CBA",相当于把字符C的地址给strp,而字符串的地址是连续的,所以strp相当于是字符串CBA的首地址。*strp是指向某个具体的字符的,*strp=字符串,显然不对
[解决办法]
这个好理解哈,
表达式"..."的返回值是指向该字符串常量的指针。

严格的说,A、C、D都是可以的。但除了C以外都是不安全用法。
先说为什么B错误,原因很简单:数组名的实质是指针常量,常量是不能作左值的。

A.由于ch是char型,ch="CBA"实质是将常量"CBA"的地址截断存入ch,至于截的是高8位还是低8位要看CPU的寻址方式。(这会导致Warning,但运行没问题,想使编译器不抛Warning的话可以进行强制转换:ch=(char)"CBA")

D.由于strp是char型指针,*strp="CBA"实际上和A效果是一样的。只是这样写还存在strp没初始化而可能造成的非法地址问题。

C.是常规用法,没什么好解释的。

热点排行