Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1530763
  • 博文数量: 226
  • 博客积分: 3997
  • 博客等级: 少校
  • 技术积分: 2369
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-19 17:26
个人简介

Never save something for a special occasion. Every day in your life is a special occasion.

文章分类

全部博文(226)

文章存档

2018年(5)

2017年(11)

2016年(1)

2015年(17)

2014年(14)

2013年(30)

2012年(5)

2011年(52)

2010年(107)

分类: C/C++

2010-07-26 00:42:14

结构与联合
类型定义和变量说明
结构,由若干“成员”组成。每一个成员可以是一个基本数据类型或者又是一个构造类型。 它相当于其它高级语言中的记录。

一、结构的定义

一般形式:
struct 结构名
{
成员表列
};

例如:
  1. struct stu
  2. {
  3.     int num;
  4.     char name[20];
  5.     char ***;
  6.     float score;
  7. };

二、结构类型变量的说明

三种方法

1. 先定义结构,再说明结构变量。
如:
  1. struct stu
  2. {
  3.     int num;
  4.     char name[20];
  5.     char ***;
  6.     float score;
  7. };
  8. struct stu boy1, boy2;

2. 在定义结构类型的同时说明结构变量。
例如:
  1. struct stu
  2. {
  3.     int num;
  4.     char name[20];
  5.     char ***;
  6.     float score;
  7. }
  8. boy1, boy2;

3. 直接说明结构变量。
例如:
  1. struct
  2. {
  3.     int num;
  4.     char name[20];
  5.     char ***;
  6.     float score;
  7. }
  8. boy1, boy2;

嵌套的结构
例如
  1. struct date
  2. {
  3.     int month;
  4.     int day;
  5.     int year;
  6. }
  7. struct
  8. {
  9.     int num;
  10.     char name[20];
  11.     char ***;
  12.     struct date birthday;
  13.     float score;
  14. }
  15. boy1, boy2;

 在ANSI C中除了允许具有相同类型的结构变量相互赋值以外, 一般对结构变量的使用,包括赋值、输入、输出、 运算等都是通过结构变量的成员来实现的。

  1. main()
  2. {
  3.     struct stu
  4.     {
  5.         int num;
  6.         char *name;
  7.         char ***;
  8.         float score;
  9.     }
  10.     boy1, boy2;
  11.     boy1.num = 102;
  12.     boy1.name = "Zhang ping";
  13.     printf("input *** and score\n");
  14.     scanf("%c %f", &boy1.***, &boy1.score);
  15.     boy2 = boy1;
  16.     printf("Number=%d\nName=%s\n", boy2.num, boy2.name);
  17.     printf("***=%c\nScore=%f\n", boy2.***, boy2.score);
  18. }
结构变量的初始化
 如果结构变量是全局变量或为静态变量, 则可对它作初始化赋值。
对局部或自动结构变量不能作初始化赋值。 // ?

全局结构变量初始化
  1. struct stu
  2. {
  3.     int num;
  4.     char *name;
  5.     char ***;
  6.     float score;
  7. }
  8. boy2, boy1 = {102, "Zhang ping", 'M', 78.5};
  9. main()
  10. {
  11.     boy2 = boy1;
  12.     ……
  13. }

静态结构变量初始化
  1. main()
  2. {
  3.     static struct stu /*定义静态结构变量*/
  4.     {
  5.         int num;
  6.         char *name;
  7.         char ***;
  8.         float score;
  9.     }
  10.     boy2, boy1 = {102, "Zhang ping", 'M', 78.5};
  11.     boy2 = boy1;
  12.     printf("Number=%d\nName=%s\n", boy2.num, boy2.name);
  13.     printf("***=%c\nScore=%f\n", boy2.***, boy2.score);
  14. }
结构数组
初始化赋值,例如:
  1. struct stu
  2. {
  3.     int num;
  4.     char *name;
  5.     char ***;
  6.     float score;
  7. }
  8. boy[5] = {
  9.              {101, "Li ping", "M", 45},
  10.              {102, "Zhang ping", "M", 62.5},
  11.              {103, "He fang", "F", 92.5},
  12.              {104, "Cheng ling", "F", 87},
  13.              {105, "Wang ming", "M", 58};
  14.          }
结构指针变量
结构指针变量中的值是所指向的结构变量的首地址。
通过结构指针即可访问该结构变量, 这与数组指针和函数指针的情况是相同的。

struct 结构名 * 结构指针变量名
有了结构指针变量,就能更方便地访问结构变量的各个成员
(*结构指针变量).成员名
or
结构指针变量->成员名
例如
(*pstu).num
pstu->num
应该注意(*pstu)两侧的括号不可少, 因为成员符“.”的优先级高于“*”。

结构变量.成员名
(*结构指针变量).成员名
结构指针变量->成员名
这三种用于表示结构成员的形式是完全等效的。

结构数组指针变量
结构指针变量可以指向一个结构数组, 这时结构指针变量的值是整个结构数组的首地址。 这与普通数组的情况是一致的。

结构指针变量作函数参数
  在ANSI C标准中允许用结构变量作函数参数进行整体传送。 但是这种传送要将全部成员逐个传送, 特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。 传递指针将减小时空开销。
例如
计算一组学生的平均成绩和不及格人数。
  1. struct stu
  2. {
  3.     int num;
  4.     char *name;
  5.     char ***;
  6.     float score;
  7. }
  8. boy[5] = {
  9.              {101, "Li ping", 'M', 45},
  10.              {102, "Zhang ping", 'M', 62.5},
  11.              {103, "He fang", 'F', 92.5},
  12.              {104, "Cheng ling", 'F', 87},
  13.              {105, "Wang ming", 'M', 58},
  14.          };
  15. main()
  16. {
  17.     struct stu *ps;
  18.     void ave(struct stu *ps);
  19.     ps = boy;
  20.     ave(ps);
  21. }
  22. void ave(struct stu *ps)
  23. {
  24.     int c = 0, i;
  25.     float ave, s = 0;
  26.     for (i = 0;i < 5;i++, ps++)
  27.     {
  28.         s += ps->score;
  29.         if (ps->score < 60)
  30.             c += 1;
  31.     }
  32.     printf("s=%f\n", s);
  33.     ave = s / 5;
  34.     printf("average=%f\ncount=%d\n", ave, c);
  35. }

-------------------------------------------

联合
联合也是一种构造类型。在一个“联合”内可以定义多种不同的数据类型,“联合”变量中,允许装入该“联合”所定义的任何一种数据。 这在前面的各种数据类型中都是办不到的。
在实际问题中有很多这样的例子。
例如在学校的教师和学生中填写以下表格: 姓 名、年 龄、职 业、单位。“职业”一项可分为“教师”和“学生”两类。 对“单位”一项学生应填入班级编号,教师应填入某系某教研室。 班级可用整型量表示,教研室只能用字符类型。 要求把这两种类型不同的数据都填入“单位”这个变量中, 就必须把“单位”定义为包含整型和字符型数组这两种类型的“联合”。

  “联合”与“结构”只是在定义形式上相似,本质上区别是:结构中各成员有各自的内存空间,而在联合中,各成员共享一段内存空间。

一、联合的定义
union 联合名
{
成员表
};
例如:
union perdata
{
int class;
char office[10];
};

二、联合变量的说明
联合变量的说明和结构变量的说明方式相同, 也有三种形式。
  1. union perdata
  2. {
  3.     int class;
  4.     char officae[10];
  5. };
  6. union perdata a, b;
  7. 或者:
  8. union perdata
  9. { int class;
  10.     char office[10];
  11. }a, b;

  12. union
  13. { int class;
  14.     char office[10];
  15. }a, b

联合变量的赋值和使用
对联合变量的赋值,使用都只能是对变量的成员进行。
例如,a被说明为perdata类型的变量之后,可使用 a.class a.office
一个联合变量的值就是联合变员的某一个成员值。
也不允许对联合变量作初始化赋值,赋值只能在程序中进行。
需要强调的是,联合变量某一时刻只有一个成员有效。
 
本章小结
1. 结构和联合是两种构造类型,是用户定义新数据类型的重要手段。
2. 结构和联合有一些相似之处,它们都由成员组成。成员可以具有不同的数据类型。成员的表示方法相同。都可用三种方式作变量说明。
3. 结构和联合的区别:在结构中,各成员都占有自己的内存空间,它们是同时存在的。在联合中,所有成员不能同时占用它的内存空间,它们不能同时存在。联合变量的长度等于最长的成员的长度。
4. 结构变量可以作为函数参数,函数也可返回指向结构的指针变量。而联合变量不能作为函数参数,函数也不能返回指向联合的指针变量。但可以使用指向联合变量的指针,也可使用联合数组。
5. 结构定义允许嵌套,结构中也可用联合作为成员,形成嵌套。
6. 链表是一种重要的数据结构,它便于实现动态的存储分配。有单向链表,双向链表,循环链表等。

 
阅读(740) | 评论(0) | 转发(0) |
0

上一篇:基本类型与转换

下一篇:枚举

给主人留下些什么吧!~~