结构体与共用体
This presentation is the property of its rightful owner.
Sponsored Links
1 / 27

结构体与共用体 PowerPoint PPT Presentation


  • 88 Views
  • Uploaded on
  • Presentation posted in: General

结构体与共用体. 结构体 结构体是 一种 构造 数据类型 用途:把 不同类型 的数据组合成一个整体------- 自定义 数据类型 结构体类型定义. 合法标识符 可省 : 无名结构体. struct [ 结构体名 ] { 类型标识符 成员名; 类型标识符 成员名; ……………. } ;. 成员类型可以是 基本型或构造型. struct 是 关键字 , 不能省略. 2 字节. num. …. name. 20 字节. 1 字节. sex. 2 字节. age. 4 字节. score. …. addr.

Download Presentation

结构体与共用体

An Image/Link below is provided (as is) to download presentation

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


4463766

结构体与共用体

结构体

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

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

  • 结构体类型定义

合法标识符

可省:无名结构体

struct [结构体名]

{

类型标识符 成员名;

类型标识符 成员名;

…………….

};

成员类型可以是

基本型或构造型

struct是关键字,

不能省略


4463766

2字节

num

name

20字节

1字节

sex

2字节

age

4字节

score

…..

addr

30字节

例 struct student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

};

结构体类型定义描述结构

的组织形式,不分配内存

结构体类型定义的作用域


4463766

struct 结构体名

{

类型标识符 成员名;

类型标识符 成员名;

…………….

};

struct 结构体名 变量名表列;

结构体变量的定义

形式一:先定义结构体类型,再定义结构体变量

  • 一般形式:

例 #define STUDENT struct student

STUDENT

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

};

STUDENT stu1,stu2;

例 struct student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

};

struct student stu1,stu2;


4463766

struct 结构体名

{

类型标识符 成员名;

类型标识符 成员名;

…………….

}变量名表列;

形式二:定义结构体类型的同时定义结构体变量

一般形式:

例 struct student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}stu1,stu2;


4463766

  • 形式三:直接定义结构体变量

    • 一般形式:

struct

{

类型标识符 成员名;

类型标识符 成员名;

…………….

}变量名表列;

例 struct

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}stu1,stu2;

用无名结构体直接定义

变量只能一次


4463766

例 struct date

{ int month;

int day;

int year;

};

struct student

{ int num;

char name[20];

struct date birthday;

}stu;

例 struct student

{ 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

  • 说明

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

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

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

    • 结构体可嵌套

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

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


4463766

例 struct student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}stu1,stu2;

例 struct student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}stu1,stu2;

stu1.num=10;

例 struct student

{ int num;

char name[20];

struct date

{ int month;

int day;

int year;

}birthday;

}stu1,stu2;

例 struct student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

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

例 struct student

{ int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}stu1,stu2;

birthday

num

name

month

day

year

if(stu1==stu2)

…….. ()

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

结构体变量的引用

  • 引用规则

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

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

  • 结构体嵌套时逐级引用

成员(分量)运算符

优先级: 1

结合性:从左向右


4463766

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”};


4463766

  • 形式二:

struct 结构体名

{

类型标识符 成员名;

类型标识符 成员名;

…………….

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

例 struct student

{ int num;

char name[20];

char sex;

int age;

char addr[30];

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


4463766

  • 形式三:

struct

{

类型标识符 成员名;

类型标识符 成员名;

…………….

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

例 struct

{ int num;

char name[20];

char sex;

int age;

char addr[30];

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


4463766

num

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


4463766

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

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

例 struct student

{ int num;

char name[20];

char sex;

int age;

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

结构体数组初始化

例 struct

{ int num;

char name[20];

char sex;

int age;

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


4463766

name

count

0

Li

0

Zhang

0

Wang

例 统计后选人选票

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

}


4463766

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

结构体指针名->成员名

结构体变量名.成员名

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

int *p=&n;

*p=10;  n=10

struct student stu1;

struct student *p=&stu1;

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

例 指向结构体的指针变量

指向运算符

优先级: 1

结合方向:从左向右


4463766

p

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

}

指向结构体数组的指针


4463766

用指向结构体的指针作函数参数

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

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

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


4463766

(main)

(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


4463766

(main)

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

}


4463766

i

ch

f

共用体

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

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

  • 共用体类型定义

    定义形式:

  • union 共用体名

    {

    类型标识符 成员名;

    类型标识符 成员名;

    …………….

    };

    例 union data

    { int i;

    char ch;

    float f;

    };

    类型定义不分配内存


    4463766

    i

    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;

    共用体变量任何时刻

    只有一个成员存在

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

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


    4463766

    共用体变量名.成员名

    共用体指针名->成员名

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

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


    4463766

    高字节

    低字节

    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


    4463766

    变量的各成员同时存在

    struct node

    { char ch[2];

    int k;

    }a;

    ch

    a

    k

    ch

    b

    k

    union node

    { char ch[2];

    int k;

    }b;

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

    • 结构体与共用体

      • 区别: 存储方式不同

    • 联系: 两者可相互嵌套


    4463766

    class

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


    4463766

    • 枚举类型

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

      • 枚举类型定义

    枚举元素

    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;


    4463766

    sun=0; mon=1; (×)

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

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

    If(workday==mon)…

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

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


    4463766

    int a,b,c;

    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

    预编译时处理编译时处理

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


  • Login