1 / 27

# 结构体与共用体 - PowerPoint PPT Presentation

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.

## PowerPoint Slideshow about '结构体与共用体' - lixue

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

• 结构体是一种构造数据类型

• 用途：把不同类型的数据组合成一个整体-------自定义数据类型

• 结构体类型定义

struct [结构体名]

{

…………….

}；

struct是关键字,

2字节

num

name

20字节

1字节

sex

2字节

age

4字节

score

…..

30字节

{ int num;

char name[20];

char sex;

int age;

float score;

};

struct 结构体名

{

…………….

}；

struct 结构体名 变量名表列；

• 一般形式：

STUDENT

{ int num;

char name[20];

char sex;

int age;

float score;

};

STUDENT stu1,stu2;

{ int num;

char name[20];

char sex;

int age;

float score;

};

struct student stu1,stu2;

struct 结构体名

{

…………….

}变量名表列；

{ int num;

char name[20];

char sex;

int age;

float score;

}stu1,stu2;

struct

{

…………….

}变量名表列；

{ int num;

char name[20];

char sex;

int age;

float score;

}stu1,stu2;

struct date

{ int month;

int day;

int year;

};

struct student

{ int num;

char name[20];

struct date birthday;

}stu;

{ int num;

char name[20];

struct date

{ int month;

int day;

int year;

}birthday;

}stu;

birthday

birthday

num

num

name

name

month

month

day

day

year

year

• 说明

• 结构体类型与结构体变量概念不同

• 类型:不分配内存； 变量:分配内存

• 类型:不能赋值、存取、运算; 变量:可以

• 结构体可嵌套

• 结构体成员名与程序中变量名可相同，不会混淆

• 结构体类型及变量的作用域与生存期

struct student

{ int num;

char name[20];

char sex;

int age;

float score;

}stu1,stu2;

{ int num;

char name[20];

char sex;

int age;

float score;

}stu1,stu2;

stu1.num=10;

{ int num;

char name[20];

struct date

{ int month;

int day;

int year;

}birthday;

}stu1,stu2;

{ int num;

char name[20];

char sex;

int age;

float score;

}stu1,stu2;

stu1.score=85.5;

printf(“%d,%s,%c,%d,%f,%s\n”,stu1); ()

stu1.birthday.month=12;

stu1.score+=stu2.score;

stu1.age++;

stu1={101,“Wan Lin”,‘M’,19,87.5,“DaLian”}; ()

stu2=stu1; ( )

{ int num;

char name[20];

char sex;

int age;

float score;

}stu1,stu2;

birthday

num

name

month

day

year

if(stu1==stu2)

…….. ()

• 引用方式： 结构体变量名.成员名

• 引用规则

• 结构体变量不能整体引用,只能引用变量成员

• 可以将一个结构体变量赋值给另一个结构体变量

• 结构体嵌套时逐级引用

struct 结构体名

{

…………….

}；

struct 结构体名 结构体变量={初始数据}；

{ int num;

char name[20];

char sex;

int age;

};

struct student stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”};

struct 结构体名

{

…………….

}结构体变量={初始数据}；

{ int num;

char name[20];

char sex;

int age;

struct

{

…………….

}结构体变量={初始数据}；

{ int num;

char name[20];

char sex;

int age;

num

name

name

25B

stu[0]

sex

sex

age

age

stu[1]

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];

stu[1].age++;

struct student

{ int num;

char name[20];

char sex;

int age;

};

struct student stu[ ]={{100,“Wang Lin”,‘M’,20},

{101,“Li Gang”,‘M’,19},

{110,“Liu Yan”,‘F’,19}};

struct student

{ int num;

char name[20];

char sex;

int age;

}str[3];

strcpy(stu[0].name,”ZhaoDa”);

• 结构体数组引用

struct student

{ int num;

char name[20];

char sex;

int age;

};

struct student stu[ ]={100,“Wang Lin”,‘M’,20,

101,“Li Gang”,‘M’,19,

110,“Liu Yan”,‘F’,19};

• 引用方式： 结构体数组名[下标].成员名

{ int num;

char name[20];

char sex;

int age;

}stu[ ]={{……},{……},{……}};

{ int num;

char name[20];

char sex;

int age;

}stu[ ]={{……},{……},{……}};

count

0

Li

0

Zhang

0

Wang

struct person

{ char name[20];

int count;

main()

for(i=1;i<=10;i++)

for(j=0;j<3;j++)

}

for(i=0;i<3;i++)

}

• (*结构体指针名).成员名

p

num

name

struct student

{ int num;

char name[20];

char sex;

int age;

}stu;

struct student *p=&stu;

stu

sex

age

main()

{ struct student

{ long int num;

char name[20];

char sex;

float score;

}stu_1,*p;

p=&stu_1;

stu_1.num=89101;

strcpy(stu_1.name,"Li Lin");

p->sex='M';

p->score=89.5;

printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n",

(*p).num,p->name,stu_1.sex,p->score);

}

• 指向结构体变量的指针

• 定义形式：struct 结构体名 *结构体指针名;

例 struct student *p;

• 使用结构体指针变量引用成员形式

int *p=&n;

*p=10;  n=10

struct student stu1;

struct student *p=&stu1;

stu1.num=101;  (*p).num=101

num

name

stu[0]

sex

age

p+1

stu[1]

stu[2]

struct student

{ int num;

char name[20];

char sex;

int age;

}stu[3]={{10101,"Li Lin",'M',18},

{10102,"Zhang Fun",'M',19},

{10104,"Wang Min",'F',20}};

main()

{ struct student *p;

for(p=stu;p<stu+3;p++)

printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);

}

• 用结构体变量的成员作参数----值传递

• 用指向结构体变量或数组的指针作参数----地址传递

• 用结构体变量作参数----多值传递，效率低

(main)

(main)

a :27

a :27

a :27

a :27

a :18

a :27

arg

arg

arg

b: 3

b: 3

b: 3

b: 5

b: 3

b: 3

(main)

c :30

c :30

c :30

c :30

c :30

c :90

arg

(func)

(func)

parm

parm

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");

}

copy

(main)

(main)

a :27

a :18

a :18

a :27

(func)

(func)

arg

arg

arg

b: 5

b: 3

b: 3

b: 5

(main)

parm

parm

****

****

c :30

c :90

c :30

c :90

arg

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");

}

ch

f

• 构造数据类型,也叫联合体

• 用途：使几个不同类型的变量共占一段内存(相互覆盖)

• 共用体类型定义

定义形式：

• union 共用体名

{

类型标识符 成员名；

类型标识符 成员名；

…………….

}；

例 union data

{ int i;

char ch;

float f;

};

类型定义不分配内存

i

ch

ch

f

f

a

b

• 共用体变量的定义

形式一:

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;

共用体变量任何时刻

只有一个成员存在

共用体变量定义分配内存,

长度=最长成员所占字节数

共用体变量名.成员名

共用体指针名->成员名

(*共用体指针名).成员名

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; ()

• 不能在定义共用体变量时初始化

例 a.i=1;

a.ch=‘a’;

a.f=1.5;

printf(“%d”,a.i); (编译通过，运行结果不对)

• 可以用一个共用体变量为另一个变量赋值

例 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; ()

低字节

01100001 01000001

ch[0]

01000001

ch[1]

01100001

例 将一个整数按字节输出

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]);

}

运行结果：

i=60501

ch0=101,ch1=141

ch0=A,ch1=a

struct node

{ char ch[2];

int k;

}a;

ch

a

k

ch

b

k

union node

{ char ch[2];

int k;

}b;

任一时刻只有一个成员存在

• 结构体与共用体

• 区别: 存储方式不同

• 联系: 两者可相互嵌套

循环n次

name

num

sex

job

position

读入姓名、号码、性别、职务

Li

1011

F

S

501

Wang

2086

job==‘s’

M

T

prof

job==‘t’

读入class

读入

position

输出

“输入错”

循环n次

job==‘s’

输出:姓名,号码,

性别,职业,职务

输出:姓名,号码,

性别,职业,班级

例 结构体中嵌套共用体

struct

{ int num;

char name[10];

char sex;

char job;

union

{ int class;

char position[10];

}category;

}person[2];

• 枚举类型

• 定义：将变量的值一一列举出来，变量的值只限于列举出来的值的范围之内。

• 枚举类型定义

枚举元素

enum weekday ｛sun, mon, tue, wed, thu, fri, sat ｝;

• 枚举变量定义

Workday=mon;week_end=sun;

enum weekday workday,week_end;

enum ｛sun, mon, tue, wed, thu, fri, sat ｝workday,week_end;

说明:1、在C编译中，对枚举元素按照常量处理

2、枚举元素是有值的，按定义时的顺序使它们为0,1,2…。

If(workday==mon)…

3、枚举值可以用来作判断比较。

4 、一个整数不能直接赋给一个枚举变量。

float f1,f2;

• 用typedef定义类型

• 功能：用自定义名字为已有数据类型命名

• 类型定义简单形式： typedef type name;

例 INTEGER a,b,c;

REAL f1,f2;

例 typedef int INTEGER;

用户定义的类型名

已有数据类型名

类型定义语句关键字

例 typedef float REAL;

类型定义后,与已有类型一样使用

说明:

1.typedef 没有创造新数据类型

2.typedef 是定义类型,不能定义变量

3.typedef 与 define 不同

definetypedef

预编译时处理编译时处理

简单字符置换 为已有类型命名