你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体第九章 结构体与共用体结构体结构体变量的定义结构体变量的引用结构体变量的初始化结构体数组结构体和指针共用体你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体
9.1 结构体
结构体是一种 构造 数据类型
用途:把 不同类型 的数据组合成一个整体 -------自定义 数据类型结构体类型定义
struct [结构体名 ]
{
类型标识符 成员名;
类型标识符 成员名;
…………….
};
成员类型可以是基本型或构造型struct是 关键字,
不能省略合法标识符可省,无名结构体你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体例 struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
name
num
sex
age
score
addr
2字节
2字节
20字节
1字节
4字节
30字节

…..
结构体类型定义描述结构的组织形式,不分配内存结构体类型定义的 作用域例子图解你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体先定义结构体类型,再定义结构体变量一般形式:
struct 结构体名
{
类型标识符 成员名;
类型标识符 成员名;
…………….
};
struct 结构体名 变量名表列 ;
9.2 结构体变量的定义你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体一般形式:
struct 结构体名
{
类型标识符 成员名;
类型标识符 成员名;
…………….
}变量名表列 ;
例 struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu1,stu2;
定义结构体类型的同时定义结构体变量你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体一般形式:
struct
{
类型标识符 成员名;
类型标识符 成员名;
…………….
}变量名表列 ;
例 struct
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu1,stu2;
用 无名结构体 直接定义变量 只能一次直接定义结构体变量你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体结构体类型与结构体变量概念不同类型,不分配内存 ; 变量,分配内存类型,不能赋值、存取、运算 ; 变量,可以结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆结构体类型及变量的作用域与生存期说明:
你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体引用规则结构体变量 不能整体引用,只能引用变量 成员可以将一个结 构体变量赋值给另一个结构体变量结构体嵌套时 逐级引用成员 (分量 )运算符优先级,1
结合性,从左向右引用方式,结构体变量名,成员名
9.3 结构体变量的引用你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体形式一,struct 结构体名
{
类型标识符 成员名;
类型标识符 成员名;
…………….
};
struct 结构体名 结构体变量 ={初始数据 };
例 struct student
{ int num;
char name[20];
char sex;
int age;
char addr[30];
};
struct student stu1={112,“Wang Lin”,?M?,19,“200 Beijing Road”};
9.4 结构体变量的初始化你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体
struct 结构体名
{
类型标识符 成员名;
类型标识符 成员名;
…………….
}结构体变量 ={初始数据 };
例 struct student
{ int num;
char name[20];
char sex;
int age;
char addr[30];
}stu1={112,“Wang Lin”,?M?,19,“200 Beijing Road”};
结构体变量的初始化 形式二:
你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体
struct
{
类型标识符 成员名;
类型标识符 成员名;
…………….
}结构体变量 ={初始数据 };
例 struct
{ int num;
char name[20];
char sex;
int age;
char addr[30];
}stu1={112,“Wang Lin”,?M?,19,“200 Beijing Road”};
结构体变量的初始化 形式三:
你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体结构体数组的定义三种形式:
形式一,
struct student
{ int num;
char name[20];
char sex;
int age;
};
struct student stu[2];
形式二,
struct student
{ int num;
char name[20];
char sex;
int age;
}stu[2];
形式三,
struct
{ int num;
char name[20];
char sex;
int age;
}stu[2];
num
name
sex
age
num
name
sex
age
stu[0]
stu[1]
25B
9.5 结构体数组你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体例 struct
{ int num;
char name[20];
char sex;
int age;
}stu[ ]={{……},{……},{……}};
结构体数组引用引用方式,结构体数组名 [下标 ].成员名
struct student
{ int num;
char name[20];
char sex;
int age;
}str[3];
stu[1].age++;
strcpy(stu[0].name,”ZhaoDa”);
结构体数组初始化你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体
struct person
{ char name[20];
int count;
}leader[3]={“Li”,0,“Zhang”,0,”Wang“,0};
main()
{ int i,j; char leader_name[20];
for(i=1;i<=10;i++)
{ scanf("%s",leader_name);
for(j=0;j<3;j++)
if(strcmp(leader_name,leader[j].name)==0)
leader[j].count++;
}
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
}
name count
Li
Zhang
Wang
0
0
0
例 统计后选人选票你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体指向结构体变量的指针定义形式,struct 结构体名 *结构体指针名 ;
例 struct student *p;
使用结构体指针变量引用成员形式 存放结构体变量在内存的起始地址
num
name
sex
age
stu
pstruct student{ int num;
char name[20];
char sex;
int age;
}stu;
struct student *p=&stu;
(*结构体指针名 ).成员名 结构体指针名 ->成员名 结构体变量名,成员名指向运算符优先级,1
结合方向:从左向右例 指向结构体的指针变量例 int n;
int *p=&n;
*p=10;? n=10
struct student stu1;
struct student *p=&stu1;
stu1.num=101;? (*p).num=101
9.6 结构体和指针你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体用结构体变量的成员作参数 ----值传递用指向结构体变量或数组的指针作参数 ----地址传递用结构体变量作参数 ----多值传递,效率低用指向结构体的指针作函数参数你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体
struct data
{ int a,b,c; };
main()
{ void func(struct data);
struct data arg;
arg.a=27; arg.b=3; arg.c=arg.a+arg.b;
printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c);
printf("Call Func()....\n");
func(arg);
printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c);
}
void func(struct data parm)
{ printf("parm.a=%d parm.b=%d parm.c=%d\n",parm.a,parm.b,parm.c);
printf("Process...\n");
parm.a=18; parm.b=5; parm.c=parm.a*parm.b;
printf("parm.a=%d parm.b=%d parm.c=%d\n",parm.a,parm.b,parm.c);
printf("Return...\n");
}
arga,27b,3
c,30
(main)
(func)
parm
a,27
b,3
c,30
copy
arg
a,
b,3
c,30
(func)
parm
a,18
b,5
c,90
a,27
b,3
c,30
例 用结构体变量作函数参数( 1)
你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体
struct data
{ int a,b,c; };
main()
{ void func(struct data *parm);
struct data arg;
arg.a=27; arg.b=3; arg.c=arg.a+arg.b;
printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c);
printf("Call Func()....\n");
func(&arg);
printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c);
}
void func(struct data *parm)
{ printf("parm->a=%d parm->b=%d parm->c=%d\n",parm->a,parm->b,parm->c);
printf("Process...\n");
parm->a=18; parm->b=5; parm->c=parm->a*parm->b;
printf("parm->a=%d parm->b=%d parm->c=%d\n",parm->a,parm->b,parm->c);
printf("Return...\n");
}
arg
a,18
b,5
c,90
(main)
arg
a,27
,3
c,30
ai )
arga,27b,3
c,30
ai )
(func)
parm****
arga,18b,5
c,9
(main)
(f c)
例 用结构体指针变量作函数参数( 2)
你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体
构造数据类型,也叫联合体
用途:使几个不同类型的变量共占一段内存 (相互覆盖 )
共用体类型定义定义形式,union 共用体名
{
类型标识符 成员名;
类型标识符 成员名;
…………….
};例 union data
{ int i;
char ch;
float f;
}; f
ch
i 类型定义 不分配内存
9.8 共用体你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体形式一,
union data
{ int i;
char ch;
float f;
}a,b;
形式二,
union data
{ int i;
char ch;
float f;
};
union data a,b,c,*p,d[3];
形式三,
union
{ int i;
char ch;
float f;
}a,b,c;
f
ch
i
f
ch
i
a b
共用体变量定义 分配内存,
长度 =最长成员 所占字节数共用体变量任何时刻只有 一个成员 存在共用体变量的定义你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体引用方式:
例 a.i=1;
a.ch=?a?;
a.f=1.5;
printf(“%d”,a.i); (?编译通过,运行结果不对 )
引用规则不能引用共用体变量,只能 引用其成员共用体指针名 ->成员名共用体变量名,成员名 (*共用体指针名 ).成员名
union data
{ int i;
char ch;
float f;
};
union data a,b,c,*p,d[3];
a.i a.ch a.f
p->i p->ch p->f
(*p).i (*p).ch (*p).f
d[0].i d[0].ch d[0].f
共用体变量中起作用的成员是 最后一次存放的成员例 union
{ int i;
char ch;
float f;
}a;
a=1; (?)
不能 在定义共用体变量时 初始化例 union
{ int i;
char ch;
float f;
}a={1,?a?,1.5}; (?)
可以用一个共用体变量为另一个变量赋值例 float x;
union
{ int i; char ch; float f;
}a,b;
a.i=1; a.ch=?a?; a.f=1.5;
b=a; (?)
x=a.f; (?)
共用体变量引用你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体
01100001 01000001
低字节高字节
01000001
01100001
ch[0]
ch[1]
运行结果:
i=60501
ch0=101,ch1=141
ch0=A,ch1=a
main()
{ union int_char
{ int i;
char ch[2];
}x;
x.i=24897;
printf("i=%o\n",x.i);
printf("ch0=%o,ch1=%o\n
ch0=%c,ch1=%c\n",
x.ch[0],x.ch[1],x.ch[0],x.ch[1]);
}
例 将一个整数按字节输出你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体区别,存储方式不同
struct node
{ char ch[2];
int k;
}a;
union node
{ char ch[2];
int k;
}b;
achk
bch k
变量的各成员同时存在任一时刻只有一个成员存在联系,两者可相互嵌套结构体与共用体你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体功能:用自定义名字为 已有 数据类型命名类型定义 简单形式,typedef type name;
例 typedef int INTEGER;类型定义语句关键字 已有数据类型名 用户定义的类型名例 typedef float REAL;
类型定义后,与已有类型一样使用例 INTEGER a,b,c;
REAL f1,f2;
int a,b,c;
float f1,f2;
说明,
1.typedef 没有创造 新数据类型
2.typedef 是定义类型,不能定义变量
3.typedef 与 define 不同
define typedef
预编译时处理 编译时处理简单字符置换 为已有类型命名用 typedef定义类型你现在所处的位置在,首页?C语言教学?幻灯片版?第九章 结构体与共用体
按定义变量方法先写出定义体 如 int i;
将变量名换成新类型名 如 int INTEGER;
最前面加 typedef 如 typedef int INTEGER;
用新类型名定义变量 如 INTEGER i,j;
例 定义数组类型
int a[100];
int ARRAY[100];
typedef int ARRAY[100];
ARRAY a,b,c;
int a[100],b[100],c[100];
例 定义指针类型
char *str;
char *STRING;
typedef char *STRING;
ST ING p,s[10];
char *p;
char *s[10];
例 定义函数指针类型
int (*p)();
int (*POWER)();
typedef int (*POWER)();
POWER p1,p2;
int (*p1)(),(*p2)();
例 定义结构体类型
struct date
{ int month;
int day;
int year;
}d;
例 定义结构体类型
struct date
{ int month;
int day;
int year;
}DATE;
例 定义结构体类型
typedef struct date
{ int month;
int day;
int year;
}DATE;
例 定义结构体类型
DATE birthday,*p;
struct date
{ int month;
int day;
int year;
}birthday,*p;
类型定义可嵌套例 typedef struct club
{ char name[20];
int size;
int year;
}GROUP;
typedef GROUP *PG;
PG pclub;? GROUP *pclub;? struct club *pclub;
GROUP为结构体类型
PG为指向 GROUP的指针类型
typedef定义类型步骤