结构与联合
类型定义和变量说明
结构,由若干“成员”组成。每一个成员可以是一个基本数据类型或者又是一个构造类型。 它相当于其它高级语言中的记录。
一、结构的定义
一般形式:
struct 结构名
{
成员表列
};
例如:
- struct stu
-
{
-
int num;
-
char name[20];
-
char ***;
-
float score;
-
};
二、结构类型变量的说明
三种方法
1. 先定义结构,再说明结构变量。
如:
- struct stu
-
{
-
int num;
-
char name[20];
-
char ***;
-
float score;
-
};
-
struct stu boy1, boy2;
2. 在定义结构类型的同时说明结构变量。
例如:
- struct stu
-
{
-
int num;
-
char name[20];
-
char ***;
-
float score;
-
}
-
boy1, boy2;
3. 直接说明结构变量。
例如:
- struct
-
{
-
int num;
-
char name[20];
-
char ***;
-
float score;
-
}
-
boy1, boy2;
嵌套的结构
例如
- struct date
-
{
-
int month;
-
int day;
-
int year;
-
}
-
struct
-
{
-
int num;
-
char name[20];
-
char ***;
-
struct date birthday;
-
float score;
-
}
-
boy1, boy2;
在ANSI C中除了允许具有相同类型的结构变量相互赋值以外, 一般对结构变量的使用,包括赋值、输入、输出、 运算等都是通过结构变量的成员来实现的。
- main()
-
{
-
struct stu
-
{
-
int num;
-
char *name;
-
char ***;
-
float score;
-
}
-
boy1, boy2;
-
boy1.num = 102;
-
boy1.name = "Zhang ping";
-
printf("input *** and score\n");
-
scanf("%c %f", &boy1.***, &boy1.score);
-
boy2 = boy1;
-
printf("Number=%d\nName=%s\n", boy2.num, boy2.name);
-
printf("***=%c\nScore=%f\n", boy2.***, boy2.score);
-
}
结构变量的初始化
如果结构变量是全局变量或为静态变量, 则可对它作初始化赋值。
对局部或自动结构变量不能作初始化赋值。 // ?
例
全局结构变量初始化
- struct stu
-
{
-
int num;
-
char *name;
-
char ***;
-
float score;
-
}
-
boy2, boy1 = {102, "Zhang ping", 'M', 78.5};
-
main()
-
{
-
boy2 = boy1;
-
……
-
}
例
静态结构变量初始化
- main()
-
{
-
static struct stu /*定义静态结构变量*/
-
{
-
int num;
-
char *name;
-
char ***;
-
float score;
-
}
-
boy2, boy1 = {102, "Zhang ping", 'M', 78.5};
-
boy2 = boy1;
-
printf("Number=%d\nName=%s\n", boy2.num, boy2.name);
-
printf("***=%c\nScore=%f\n", boy2.***, boy2.score);
-
}
结构数组
初始化赋值,例如:
- struct stu
-
{
-
int num;
-
char *name;
-
char ***;
-
float score;
-
}
-
boy[5] = {
-
{101, "Li ping", "M", 45},
-
{102, "Zhang ping", "M", 62.5},
-
{103, "He fang", "F", 92.5},
-
{104, "Cheng ling", "F", 87},
-
{105, "Wang ming", "M", 58};
-
}
结构指针变量
结构指针变量中的值是所指向的结构变量的首地址。
通过结构指针即可访问该结构变量, 这与数组指针和函数指针的情况是相同的。
struct 结构名 * 结构指针变量名
有了结构指针变量,就能更方便地访问结构变量的各个成员
(*结构指针变量).成员名
or
结构指针变量->成员名
例如
(*pstu).num
pstu->num
应该注意(*pstu)两侧的括号不可少, 因为成员符“.”的优先级高于“*”。
结构变量.成员名
(*结构指针变量).成员名
结构指针变量->成员名
这三种用于表示结构成员的形式是完全等效的。
结构数组指针变量
结构指针变量可以指向一个结构数组, 这时结构指针变量的值是整个结构数组的首地址。 这与普通数组的情况是一致的。
结构指针变量作函数参数
在ANSI C标准中允许用结构变量作函数参数进行整体传送。 但是这种传送要将全部成员逐个传送, 特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。 传递指针将减小时空开销。
例如
计算一组学生的平均成绩和不及格人数。
- struct stu
-
{
-
int num;
-
char *name;
-
char ***;
-
float score;
-
}
-
boy[5] = {
-
{101, "Li ping", 'M', 45},
-
{102, "Zhang ping", 'M', 62.5},
-
{103, "He fang", 'F', 92.5},
-
{104, "Cheng ling", 'F', 87},
-
{105, "Wang ming", 'M', 58},
-
};
-
main()
-
{
-
struct stu *ps;
-
void ave(struct stu *ps);
-
ps = boy;
-
ave(ps);
-
}
-
void ave(struct stu *ps)
-
{
-
int c = 0, i;
-
float ave, s = 0;
-
for (i = 0;i < 5;i++, ps++)
-
{
-
s += ps->score;
-
if (ps->score < 60)
-
c += 1;
-
}
-
printf("s=%f\n", s);
-
ave = s / 5;
-
printf("average=%f\ncount=%d\n", ave, c);
-
}
-------------------------------------------
联合
联合也是一种构造类型。在一个“联合”内可以定义多种不同的数据类型,“联合”变量中,允许装入该“联合”所定义的任何一种数据。 这在前面的各种数据类型中都是办不到的。
在实际问题中有很多这样的例子。
例如在学校的教师和学生中填写以下表格: 姓 名、年 龄、职 业、单位。“职业”一项可分为“教师”和“学生”两类。 对“单位”一项学生应填入班级编号,教师应填入某系某教研室。 班级可用整型量表示,教研室只能用字符类型。 要求把这两种类型不同的数据都填入“单位”这个变量中, 就必须把“单位”定义为包含整型和字符型数组这两种类型的“联合”。
“联合”与“结构”只是在定义形式上相似,本质上区别是:结构中各成员有各自的内存空间,而在联合中,各成员共享一段内存空间。
一、联合的定义
union 联合名
{
成员表
};
例如:
union perdata
{
int class;
char office[10];
};
二、联合变量的说明
联合变量的说明和结构变量的说明方式相同, 也有三种形式。
- union perdata
-
{
-
int class;
-
char officae[10];
-
};
-
union perdata a, b;
-
或者:
-
union perdata
-
{ int class;
-
char office[10];
-
}a, b;
-
或
-
union
-
{ int class;
-
char office[10];
-
}a, b
联合变量的赋值和使用
对联合变量的赋值,使用都只能是对变量的成员进行。
例如,a被说明为perdata类型的变量之后,可使用 a.class a.office
一个联合变量的值就是联合变员的某一个成员值。
也不允许对联合变量作初始化赋值,赋值只能在程序中进行。
需要强调的是,联合变量某一时刻只有一个成员有效。
本章小结
1. 结构和联合是两种构造类型,是用户定义新数据类型的重要手段。
2. 结构和联合有一些相似之处,它们都由成员组成。成员可以具有不同的数据类型。成员的表示方法相同。都可用三种方式作变量说明。
3. 结构和联合的区别:在结构中,各成员都占有自己的内存空间,它们是同时存在的。在联合中,所有成员不能同时占用它的内存空间,它们不能同时存在。联合变量的长度等于最长的成员的长度。
4. 结构变量可以作为函数参数,函数也可返回指向结构的指针变量。而联合变量不能作为函数参数,函数也不能返回指向联合的指针变量。但可以使用指向联合变量的指针,也可使用联合数组。
5. 结构定义允许嵌套,结构中也可用联合作为成员,形成嵌套。
6. 链表是一种重要的数据结构,它便于实现动态的存储分配。有单向链表,双向链表,循环链表等。
阅读(740) | 评论(0) | 转发(0) |