结构体,共用体,枚举及类型定义
worker2.wage=worker.wage; sum=worker1.wage+worker2.wage; worker1.age++
前面已经介绍了有关的数据类型和一些基本的指针变量及其相关的应用,为了求解较为复杂的问题,C语言提供了一种自定义的数据类型的机制,用这种机制可以定义出较复杂的数据类型。这些较复杂数据类型的元素或成员的数据仍然是基本数据类型。灵活地使用这些数据可以大大提高数据的处理效率。
在解决某些实际问题时,某一种相同的数据类型已经不能满足要求,而必须要多种数据类型的同时运用。例如:你在统计你们班的大学一年级新生购买班服的尺寸时,你需要了解到每个人的身高,体重以及性别。这是一个现实问题,在定义这些变量时,你需要用到float,char等一些变量类型,显然用一种数据类型是不够的,C语言因此规定了一种构造数据类型————结构体。
结构体实际上是c编译没有提供的数据类型,可以由程序员根据实际情况来自己构造的一种新的数据类型。
结构体定义的一般格式为
struct 结构体名{ 数据类型 成员名 1; 数据类型 成员名2; …… 数据类型 成员名n; };
其中;struct是用来说明类型是结构体的关键字,结构体的定义描述了该结构体的组织形式。在程序执行时,结构体说明并不引起系统为该结构体分配空间。真正占用储存空间的是具有相应结构类型的变量。
下面举个例子
struct worker{ char name [20]; char sex; int age; float wage; char number [12]; char *p_addr; };
由上面的例子,我们可以看到结构体成员可以是任何基本数据类型的变量,也可以是数组,指针等等。
将上面的程序稍微改动一下。得到下面的程序;
struct worker{ char name [20]; char sex; int age; float wage; struct birthday{ int year; int month; int day; }; char *p_addr; };
以上图,我们可以明显的看到结构体变量类型中又有一个结构体变量类型,这就是结构体类型的嵌套,一定要注意程序中的花括号要成对。
struct worker{ char name[20]; char sex; int age; float wage ; struct birthday { int year ; int month; int day; }birthday1; char *p_addr; }worker1,worker2; worker1.sex; worker2.sex;
worker1.sex表示结构体变量worker1的成员sex,
对这个程序,我们要注意的几点
1`如果成员本身又属于一个结构体的话,这需要用到若干成员运算符,一级一级的找下去
例如;可以这样访问成员
worker1.sex;
worker2.birthday1.month;
2`对结构体变量的成员可以像普通变量一样进行各种运算、例如
worker1.wage=worker2.wage; sum=worker1.wage+worker2.wage; worker1.age++;
3`可以引用结构体变量成员地址,也可以引用结构体变量的地址。
scanf(“%d”’,&worker1.age); 输入worker1.age的值
printf("%o",&worker1): 输入worker1的首地址
关于结构体与数组的内容,我们只举一个例子
struct worker{ char name[20]; char sex; int age; float wage; struct birthday{ int year; int month; int day; }birthday1; char *p_addr: };
以上定义一个数组worker1,其元素为struct worker类型数据,数组有3个元素。
有关指向结构体数组的指针有人举一个例子
#include <stdlib.h> #include <stdio.h> struct stud_type{ char name[20]; long num; int age; char sex; }; main() {stuct stud_type student[3],*p; int i; char numstr[20]; for (i=0;p=student;i<3;p++,i++) { printf ("Enter all date of student [%d]:\n,i); scanf ("%S%ld%c",p->age,&p->num,&p->sex): } for (i=0,p=student ;p<student+3;p++,I++) printf ("%3d%-20s%8ld%6d%3c\n",i,p->name,p->num,p->age,p->sex)}; };
这个题目实际上是要求输入3个人学生的信息并打印出来。
这道题,很有看点,综合性较强,用到了我们之前学到的知识,值得读者深思。
在结构体与函数中,值得讲的是返回结构体类型值的函数。
因为对于返回函数,我们经常见到,但对其了解的不够多。 函数的返回值也可以是结构体类型,这时在函数定义是,需要说明返回值的类型为相对应的结构体类型。函数input()的功能是输入一个结构体数据,并将输入结构体数据作为返回值,返回给第i个学生记录,实现第i个学生的数据输入。
struct student input() { int; struct student stu: scanf("%id",&stu.num) get (stu.name) for (i=0;i<3;I++) scanf ("%f,&stu,score[i]): return stu: }