第七章结构体与共用体
- 格式:doc
- 大小:66.50 KB
- 文档页数:5
结构体与共用体笔记定义结构体C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(structre)。
在其他一些高级语言中称为“记录”.定义后的结构体类型和系统提供的标准类型(如int, char, float, double 等)具有相似的作用,都可以用来定义变量,只不过int等类型是系统已声明的,而结构体类型是由用户根据需要在程序中指定的。
定义一个结构体类型的一般形式为:struct 结构体名{ 成员表列};注意:1.结构体类型的名字是由一个关键字struct和结构体名组合而成的(例如struct Student) ,结构体名是由用户指定的,又称“结构体标记”,以区别于其他结构体类型。
上面的结构体声明中Student就是结构体名(结构体标记)。
2.花括号内是该结构体所包括的子项,称为结构体的成员。
“成员表列"(member list)也称为“域表”(field list),成员表列由若干个成员组成,每一个成员是结构体中的一个域。
对每个成员也必须作类型说明,其形式为:类型说明符成员名;成员名的命名应符合标识符的书写规定。
例如:struct stu{int num;char name[20];char sex;float score;};3.一个结构体的成员可以属于另一个结构体类型(嵌套)。
例如:struct Date //声明一个结构体类型struct Date{ int month;//月int day;//日int year;//年}struct Student//声明一个结构体类型struct Student{ int num;char name[20];char sex;int age;struct Date birthday;//成员birthday属于struct Date 类型char addr[30];};结构体类型变量1.定义结构体类型变量说明结构变量有以下三种方法。
第七章结构体与共用体【计划课时】授课课时+上机课时(预习内容:教材第十一章)与已学过的各种标准数据类型相比,本章介绍——如何自己构造数据类型(构造型数据)一、结构体1.概述数组——相同标准类型数据(数组元素)的集合(char/int/float等)结构体——用户选定的各种类型数据(“成员”或“域”)的集合(无穷种)数据库技术中,建立一个库文件的步骤是:先建空表(表头),后输记录。
同一记录的不同字段可以为不同的类型,可以有不同的长度。
一条记录的总长度为各字段之和(+1)。
建立一个结构体类似于数据库中建立“表头”。
其基本形式如下:关键字用户指定struct 结构体名{ ……类型标识符成员名; /*成员表列*/……} ; /*分号不能省略*/【例一】struct s tudent{ int number;char name[6]; /*number,sex等为成员名*/char sex;int age;char address[20];} ;本质上,它定义了一个名为”student”的“结构体类型”(表头)。
该结构体类型的作用:用来定义“结构体变量”。
注意成员定义与普通变量定义的区别:成员定义时——不为其分配内存变量定义时——为其分配内存到此,struct student 相当于标准数据类型关键字char, int ,float…我们可以用它来定义“结构体变量”。
比较:int a,b,c; 定义三个整型变量,每个变量占二个字节,可单独赋值。
struct student a,b,c;定义三个结构体类型变量,每个变量下有若干“成员”。
其占用的内存长度等于各成员项长度之和。
【例二】以下程序的运行结果是什么?main(){ union u_type{ int i;char ch[6]; long s; }; 2 6 4struct st_type{ union u_type u;float score[3];};printf("%d\n",sizeof(struct st_type)); } 64×3=12 12+6=18结果:182、结构体类型变量的定义①用struct 结构体名复合词定义struct 结构体名{…};struct 结构体名变量名1,变量名2,…变量名n;②在定义结构体类型的同时定义struct 结构体名{…}变量名1,变量名2,…变量名n;③直接定义结构体类型变量struct{…}变量名1,变量名2,…变量名n;实际使用中,还可以使用以下形式:先定义 #define STU struct student尔后 STU student1,student2;注意:结构体的成员可以是另一个结构体。
【例三】若有以下定义,则正确的赋值语句为。
struct complex{float real;float image;};struct value{ int no;struct complex com;}val1;A) com.real=1; B) plex.real=1;C) .real=1; D) val1.real=1;答案:C)val1.Val13、结构体变量的初始化和赋值使一个结构体变量获得数据“值”有三种方法:①定义时初始化之【例四】struct{ char name[15];char class[12];long num;} stu={“Wenli”,”Computer 1”,200113};②用赋值语句对各成员分别赋值只能逐个成员进行,不能将结构体变量作为一个整体进行输入和输出。
如对结构体变量val1,以下语句是错误的:scanf(“%s,%s,%ld”,stu);printf(“%s,%s,%ld”,stu);可改为:scanf(“%s,%s,%ld”,,stu.class,&stu.num);printf(“%s,%s,%ld” ,,stu.class,&stu.num);亦可用以下赋值语句:strcpy(,”wenli”);strcpy(stu.class, “Computer”;stu.num=200113;③同类型的结构体变量间相互赋值student1=student24、结构体变量的引用引用其成员变量用圆点(成员运算符)——优先级最高如val1.no++ sum=.real+.image可以将成员变量按普通变量运算方式处理,包括取地址:&val1 (函数间传递用)&val1.no对多级结构体,只能对最低级的成员进行赋值、存取及运算处理。
5、结构体数组①定义·定义结构体后定义P222·定义结构体时同时定义②初始化·一般初始化·省略维数[ ]·定义后初始化②引用此时每个结构体数组元素都有若干“成员”。
可以用以下形式来标识它们:数组名[i].成员名如stu[3].age6、指向结构体变量的指针一个结构体变量的指针就是该变量所占据的内存段的起始地址。
如果struct student stu_1;struct student *p;p=&stu_1;则以下三种形式等价:stu_1.age (*p).age p->age此时p->age++ 等效于(p->age)++ 先得到成员值,再使它加1++p->age 等效于++(p->age) 先使成员值加1,再使用之而如果struct student stu[5];struct student *p;p=stu;此时指针变量p的值为结构体变量p的首地址。
且p++ 表示移到下一个数组元素而非下一个成员(++p)->age 表示p先自加1(移到下一数组元素处),然后取成员值(p++)->age 表示先取p->age的值,然后p自加(移到下一数组元素处)注意:如果有struct student *p;此时p存放结构体变量指针,不可指向数组元素,如p=&stu.age如果需要指向数组元素,应另设普通指针变量,如int *p1;p1=&stu.age【例四】求程序运行结果。
main(){ struct wc{ int a;char *b;}*p;static struct wcx[2]={10,"abcd",30,"ABCD"};p=x;printf("%d,",p->a);printf("%c\n",*(++p)->b);}答案:10,A7、链表图形P230 图10.11·按需分配内存·不连续存放头指针(head)变量结点的概念(每个结点中应包括一个指针变量,用它存放下一结点的地址)。
最后一个结点的地址部分存放一个“NULL”(空地址)。
定义形式:struct student{ int number;char name[6];struct student *next;};p=p->next 将p原来所指结点中next的值赋给p,而p->next值即下一结点起始地址,故p=p->next 的作用是将p转向下一结点。
【】3、以下程序的功能是统计一个单向链表中结点的个数,其中head指向链表的首结点。
#include <stdio.h>#include <alloc.h>main(){struct node{char data;struct node *next;}*pl, *head;int count=0;... /* 建立单向链表的程序段省略*/pl=head;while( 【3】!=NULL){count++;pl= 【4】;}printf("%d", count);...}答案:【3】p1 【4】p1->next【24】以下程序的运行结果是什么?main(){ union u_type{ int i;char ch[6];long s;};struct st_type{ union u_type u;float score[3];};printf("%d\n",sizeof(struct st_type)); } 26464×3=12 12+6=18结果:18【25】以下程序的运行结果是什么?main(){ enum color{red,green=4,blue,white=blue+10}; /*red=0,blue=5*/ printf("%d,%d,%d\n",red,blue,white);}结果:0,5,15。