C语言程序设计精品讲义第7章 结构体与共同体
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⒉结构变量的说明
定义结构只是确定该结构类型的名称及其成员项的组成及成员 项的类型。必须由定义的结构类型说明结构变量,才开辟相应的内 存空间以供使用。
结构变量的说明方式: ⑴定义后说明
struct student{ long num ; char name[20] ; int age ; char add[30] ; float score ;
#include <stdio.h>
#define NUMBER 10
举 struct student { int num ;
例
char name[20] ;
定义结构说明数组 并初始化。
:
int count ;
统
} lead[3] = { 1 , “Zhang” ,0,
计
2 ,“Tan” ,0 , 3 , “Wang” , 0 } ;
说明: ⑴注意类型和变量的区别。 ⑵成员项可单独使用。wang.age=20 ⑶结构的成员项也可以是结构变量。
struct doc{ char name[20] ; struct birth age ; float sal ; };
struct birth{ int year; int mon; int day;
结构体变量的每个成员项有独立的内存单元, 而共用体变量的成员项以最大的成员项开辟单元 后,所有成员项共用单元。
union exam{ int a ;
x
float b ;
char c ;
}x ;
a
b c c
a b
举例:
#include <stdio.h>
void main (void)
{
Biblioteka Baidu
union exam{
};
wang,zhang,liu;
struct student wang,zhang,liu; ⑵定义结构类型时说明变量
用struct student 类型说明 三个变量。
⑶无名结构方式说明变量
struct{ long num ; char name[20] ; int age ; char add[30] ; float score ; }wang,zhang,liu;
定义结构,说明数组并 初始化。
}ws [ ]={ {101 , “Fang” , “Shanghai” } ,
{102 , “Tan” , “Bejing” } ,
{103 , “Wang” , “Hefei” }
};
void main ( void)
{ int i;
struct sam *pws ;
结构和联合的操作分为三个步骤:
⑴根据需要定义结构或联合类型; ⑵通过定义的类型说明变量、数组、指针; ⑶引用变量、数组元素和指针指向的对象。
7.1 结 构 体
⒈结构类型的定义
格式:
用标识符命名的结构类型名。
struct 结构名{ type 成员项1 ; type 成员项2 ;
结构标志。…
结构类型中所含的成员 项及其类型。
type 成员项n ; };
结构的定义确定了如下两点:
struct student {
⑴定义结构类型,确定结构中的成员项的名称及类型。lcohnagr
num ; name[20] ;
⑵指明该结构类型的变量在内存中的组织形式。 int age ;
char add[30] ;
float score ;
};
union exam x , *px , y[10] ;
引用:引用变量的成员项。
通过变量引用: 变量名.成员项名 通过指针引用: 指针->成员项名
⒊共用体与结构体的区别
struct exam{ int a ; float b ; char c ; }x ;
sizeof (struct exam) x
第七章 结构体与共用体
结构和联合的概念
在数据中,经常有一些既有联系,类型又不同的数据,并且它
们之间又有一定的相关性,需要一起处理。 如:学生基本档案的数据
字段: 学号 姓名 性别 地址 分数
类型: long char char char
float
C语言允许用户按自己的需要将不同的基本类型构造成一种特 殊类型,即结构和联合。
C 语言可以通过 typedef 语句,定义自己命名的数据类型。实 际上是给 C 类型重新起个名字。
typedef语句的格式: typedef type 标识符;
引用方式:
C语言的类型名。 用户定义类型名。
⑴基本类型
typedef int INTEGER ; INTEGER a , b ;
⑵数组
typedef char STRING[41] ; STRING a , b ; char a[41] , b[41] ;
{
struct student s1 ;
s1.num = 99010101 ;
s1.name = “wang hai” ; s1.score = 99 ;
结构变量。
mprintp ( &ss11 ) ;
指向结构的指针。
}
void mprintp ( stsrturcutctstsutduednetnt*sspv )
三 void main (void)
个 候 选 人 的
循 环 输 入 统
{ int i ,j ,numb ; for (i=0 ; i<NUMBER ; i++ ) { scanf (“%d” ,&numb ) ; if (numb<4&&numb>0)
票计
数 。
票 数
lead[numb-1] .count ++ ; else
}
x
0x41 0x61
ch[0] ch[1]
CHAP7EX4
7.3 枚 举 类 型
概念:有限状态的集合,以整型值代表。如:月份,星期。 ⒈枚举类型的定义 enum 枚举类型名{ 枚举元素表 } ; enum day{sun,mon,tue,wed,thv,fri,sat} ;
enum color{red,yellow,blue} ; 说明:
结构指针的应用:
⑴先说明结构指针 struct student *p,stu1;
⑵指针指向同类型的结构变量或数组。p=&stu1;
⑶通过指针引用指针指向变量的成员项,引用方式为:
方式一:(*p).成员项名 方式二: p->成员项名
结构指针主要用于对结构数组操作。
struct studoc{ int iNum;
⒈共用体类型的定义 格式:
Union 共用体名{ type 成员项 1 ; type 成员项 2 ; … type 成员项 n ;
};
union exam{ int a ; float b ; char c ; };
⒉共用体变量的说明和引用
可以用共用体类型说明:共用体变量、共用体数组、指向共用
体的指针。
⑴枚举元素如果不赋值,自动取0~n-1整数值; ⑵在定义时,可以对某个枚举元素赋值,其后的元素按此值, 自动加一递增。
⒉ 枚举变量的说明和引用 enum color col1 , col2 ;
枚举变量只能取该类型中的一个元素。 col1=red ; col2=(enum color ) 2 ;
7.4 用户定义类型
char *name; }*p,wang={2001,”wang li”};
p=&wang; printf(“%d:%s”,p->iNum,p->name};
指向结构的指针。
举例:
#include <stdio.h>
struct sam{ int num ; char name[20] ; char *addr;
⒌结构数组
结构变量也可以构造成数组,称为结构数组。每个数组元素都 是一个结构变量,都含有结构成员项。它们在内存中的地址是连续 的。
数组的说明:
struct 结构名 结构数组名 [常量表达式] ;
struct student{
long num ; char name[20] ; float score ; } stud[3] ;
printf(“Selection error\n”);
CHAP7EX1
} printf (“ \n ” ) ;
输出结果。
for (i=0 ; i<3 ; i++ )
printf (“%5s:%d\n” , lead[i].name , lead[i].count ) ;
}
⒍结构指针
概念:指向结构变量首地址的指针称为结构指针。结构指针加 一,地址加一个结构变量所占的字节。
pws = ws ; for ( i=0 ; i<3 ; i++ , pws++ )
CHAP7EX2
printf (“%-9d%-14s%-20s\n说” 明, p结ws构->指nu针m。,
pws->name ,
pws->addr ) ;
指针指向结构数组。
}
通过指针引用成员项 。
⒎结构与函数参数
当函数需要通过形参传递一个结构时,一般有两种处理办法:
{
printf(“%ld\n%s\n%5.1f\n” , sp-s>vn.unmum,,sspv-.>nnaammee, s,vs.psc->osrecore ) ;
}
7.2 共用体(union)
概念:不同数据类型的集合;每个成员项共用一段内存空间; 某一时刻只能对一个“活的active”成员项操作;
};
结构doc中的成员项是 一个birth的结构变量!
⒊结构变量的引用
结构变量都是以成员项作为引用单位,引用方式:
结构变量名.成员项名
说明: 结构变量的成员项与普通变量有相同的性质。
⒋结构体变量的初始化 结构变量可以在说明时赋初值,称为初始化。
wang.score=100;
struct student{ long num ; char *name; char sex[3] ; int age ; float score ; char addr [30] ; } wang = {99010101 , “王五” , “男” , 20 , 90.5 , “上海” } ;
说明:
={{99010101 , “Wang” ,67.5} , {99010102 , “Zhao” ,78.5} , {99010103 , “Fang” , 98.5} } ;
⑴三个结构数组元素都含有student 的成员项。 ⑵结构数组名stud,代表结构数组的首地址。 ⑶外部和静态结构数组在说明时可以初始化。
⑴传递一个结构指针(效率高)。 ⑵传递一个结构变量(效率低)。
#include<stdio.h>
void mprintp (struct student )* ;) ;
struct student { long num ;char *name ;float score;} ;
void main ( )
i
int i ;
char ch[2] ;
}x;
x.i = 24897 ;/* i:0x6141*/
printf (“i=%xH\n” , x.i);
printf (“ch[0]=%xH,ch[1]=%xH\n” , x.ch[0] , x.ch[1] );
printf (“ch[0]=%c , ch[1] = %c\n” , x.ch[0] , x.ch[1] ) ;