上一题下一题
跳转到
 
 
  世界如此多姿,发展如此迅速,窥一斑未必还能知全豹。但正如万花筒一样,每一个管窥都色彩斑斓。  
 
 
  知识通道 | 学习首页 | 教师首页 | PK首页 | 知识创造首页 | 企业首页 | 登录
 
本文对应知识领域
C 程序设计基础之五
作者:未知 申领版权
2010年12月12日 共有 908 次访问 【添加到收藏夹】 【我要附加题目
受欢迎度:

    C 程序设计基础之五
    “联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。如前面介绍的“单位”变量, 如定义为一个可装入“班级”或“教研室”的联合后,就允许赋予整型值(班级)或字符串(教研室)。要么赋予整型值,要么赋予字符串,不能把两者同时赋予它。联合类型的定义和联合变量的说明一个联合类型必须经过定义之后, 才能把变量说明为该联合类型。
    
    一、联合的定义
    定义一个联合类型的一般形式为:
    union 联合名
    {
    成员表
    };
    成员表中含有若干成员,成员的一般形式为: 类型说明符 成员名 成员名的命名应符合标识符的规定。
    例如:
    union perdata
    {
    int class;
    char office[10];
    };
    定义了一个名为perdata的联合类型,它含有两个成员,一个为整型,成员名为class;另一个为字符数组,数组名为office。联合定义之后,即可进行联合变量说明,被说明为perdata类型的变量,可以存放整型量class或存放字符数组office。
    
    二、联合变量的说明
    联合变量的说明和结构变量的说明方式相同, 也有三种形式。即先定义,再说明;定义同时说明和直接说明。以perdata类型为例,说明如下:
    union perdata
    {
    int class;
    char officae[10];
    };
    union perdata a,b; /*说明a,b为perdata类型*/
    或者可同时说明为:
    union perdata
    {
    int class;
    char office[10];
    }
    a,b;或直接说明为:
    union
    {
    int class;
    char office[10];
    }
    a,b 
    经说明后的a,b变量均为perdata类型。 它们的内存分配示意图如图7―8所示。a,b变量的长度应等于 perdata 的成员中最长的长度, 即等于office数组的长度,共10个字节。从图中可见,a,b变量如赋予整型值时,只使用了2个字节,而赋予字符数组时,可用10个字节。
    联合变量的赋值和使用
    对联合变量的赋值,使用都只能是对变量的成员进行。 联合变量的成员表示为: 联合变量名.成员名 例如,a被说明为perdata类型的变量之后,可使用 a.class  a.office 不允许只用联合变量名作赋值或其它操作。 也不允许对联合变量作初始化赋值,赋值只能在程序中进行。还要再强调说明的是,一个联合变量, 每次只能赋予一个成员值。换句话说,一个联合变量的值就是联合变员的某一个成员值。
    [例7.15]设有一个教师与学生通用的表格,教师数据有姓名,年龄,职业,教研室四项。学生有姓名,年龄,职业,班级四项。
    编程输入人员数据, 再以表格输出。
    main()
    {
    struct
    {
    char name[10];
    int age;
    char job;
    union
    {
    int class;
    char office[10];
    } depa;
    }body[2];
    int n,i;
    for(i=0;i<2;i )
    {
    printf("input name,age,job and department\n");
    scanf("%s %d %c",body[i].name,&body[i].age,&body[i].job);
    if(body[i].job=='s')
    scanf("%d",&body[i].depa.class);
    else
    scanf("%s",body[i].depa.office);
    }
    printf("name\tage job class/office\n");
    for(i=0;i<2;i )
    {
    if(body[i].job=='s')
    printf("%s\t%3d %3c %d\n",body[i].name,body[i].age,body[i].job,body[i].depa.class);
    else
    printf("%s\t%3d %3c %s\n",body[i].name,body[i].age,
    body[i].job,body[i].depa.office);
    }
    }
    本例程序用一个结构数组body来存放人员数据, 该结构共有四个成员。其中成员项depa是一个联合类型, 这个联合又由两个成员组成,一个为整型量class,一个为字符数组office。在程序的第一个for语句中,输入人员的各项数据,先输入结构的前三个成员name,age和job,然后判别job成员项,如为"s"则对联合depa?class输入(对学生赋班级编号)否则对depa?office输入(对教师赋教研组名)。
    在用scanf语句输入时要注意,凡为数组类型的成员,无论是结构成员还是联合成员,在该项前不能再加"&"运算符。如程序第18行中
    body[i].name是一个数组类型,第22行中的body[i].depa.office也是数组类型,因此在这两项之间不能加"&"运算符。程序中的第二个for语句用于输出各成员项的值。
    
    

 

相关新闻

testtest
上善制度的炼成
新时代呼唤管理理论创新——大卫�梯斯与动态能力理论
创业的不变逻辑
创新管理需要回答的5个问题
十一、弥离
十、转院
九、生机
八、传染
七、求血

您可能对这些感兴趣  

第7讲 综合分析BIM在运用与推广中的障碍问题
考核学生质量的困难
日本福岛核电站事故初步分析
论科技异化与科技人化
中国科技计划项目管理现状与对策
财政科技资金的审计重点和内容
软科学研究机构在政府决策中的功效、困境及对策研究
打造超级DOS系统(下)
DOS命令基础应用(6)
打造超级DOS系统(上)

题目筛选器
日期:
类型:
状态:
得分: <=
分类:
作者:
职业:
关键字:
搜索

 
 
 
  焦点事件
 
  知识体系
 
  职业列表
 
 
  最热文章
 
 
  最多引用文章
 
 
  最新文章
 
 
 
 
网站介绍 | 广告服务 | 招聘信息 | 保护隐私权 | 免责条款 | 法律顾问 | 意见反馈
版权所有 不得转载
沪ICP备 10203777 号 联系电话:021-54428255
  帮助提示    
《我的太学》是一种全新的应用,您在操作中遇到疑问或者问题,请拨打电话13564659895,15921448526。
《我的太学》