工程质量等级有哪些:c语言问题

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/30 20:50:46
【2.57】下面程序的输出结果是____。
#include <stdio.h>
main()
{ union
{ int i[2];
long k;
char c[4];
}r,*s=&r;
s->i[0]=0x39;
s->i[1]=0x38;
printf("%c\n",s->c[0]);
}
A) 39 B) 9 C) 38 D) 8
参考答案B,要求有详细分析过程。

关键在于理解联合这一结构
它们占用的是同一段内存,大小为联合中最大的元素的大小,最大的为整形数组i,占用8个字节:
s->i[0]=0x39;
s->i[1]=0x38;

i[0]
------------------------------------------------
00000000 00000000 00000000 00111001 0x39=57
k---------------------------------- 0x39=57
c[3] c[2] c[1] c[0] 0x39=57

i[1]
------------------------------------------------
00000000 00000000 00000000 00111000 0x38=56

从上面可以知道:
i[0],k,c[0]~c[3]的内容是相同的

而c[0]和i[0]的最低位字节的内容相同为(ASCII码)57(10进制),字符则为9

b 9
由于s所指向的是联合储存结构,所以他是一块8字节的内存块。
对于
s->i[0]=0x39;
s->i[1]=0x38;
这样的赋值操作,就是给这个块些入 39 00 38 00
输出时按照c[4]输出即:c[0]=0x39,c[1]=0,c[2]=0x38,c[3]=0;
而0x39说对应的ASCII码就时'9',固有答案b) 9

1搂的分析的很好,不过这个共用体不是只有4个字节的内存块吗?怎么会是8个?
int i[2] 是4个
long 也是4个
char c[4]也是是个,他们中最大的就是4了
他们在内存中的存放是 39h 00h 38h 00h是没有错的
c[0]=0x39;c[0]为i[0]的底二位,c[1]=0;c[1]为i[0]的高二位,c[2]=0x38;c[2]为i[1]的底二位,c[3]=0;c[3]为i[0]的高二位;