C语言第八章.用户自定义数据类型.ppt

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

性别(sex):char
这些成员都属于某个学生的数据项,如果分别定义成相 互独立的变量,则不能体现它们之间的内在联系,而在程序 中应该把它们视为同一个数据类型的成员。
结构体类型的声明
声明结构体类型的一般形式: struct [结构体类型名] {
类型名1 结构体成员名表1; 类型名2 结构体成员名表2; …… 类型名n 结构体成员名表n; };
}
10 a.n
'A' a.ch
指向运算符”->”, 优先级最高
2、指针变量作为结构体成员
struct st
{ int n; char * ch;
};
p
10 a.n
FFCE
FFCE a.ch
c h i n a \0
main()
{
struct st a={10,"china"},*p=&a;
printf("%d,%s\n",a.n,a.ch); printf("%d,%s\n",(*p).n,(*p).ch); printf("%d,%s\n",p->n,p->ch); }
故联合体变量定义的同时只能对第一个成员赋初值:
union
内存高地址
{
char c;
int i;
float f;
}u1={'a'}; /*u1.c='a'*/ u1.i=10;
000000 00
内存低地址 010100010
1001
字符变量c占1个字节
整型变量i占2个字节 单精度实型变量f占4个字节
例:以下程序输出结果是?
{
number
char number[11]; char name[8];
11B ……
int age; char sex;
sizeof(stu1)=?
name 8B
……
};stu1,stu2;
age
struct Student stu1,stu2;
sex
……
低地址 高地址
结构体变量的初始化
可以在定义结构体变量的同时对其初始化: struct 结构体类型名 结构体变量名={成员初始化值表};
int age; char sex;
stu1.number="0208103321" ;
}stu1;
例:以下程序输出结果是?
struct date1
结构体类型可
{
以嵌套定义
int x;
struct date2
{ int i;
two.x
21
char c1; }one;
two.one.i
1
char c2; }two={1,1,'A','B'}; main() {
main()
{
struct st x={10, 'A'};
fun(&x);
} printf("In main:x.n=%d,x.chIn=%mca\inn":,xx..nn,=x1.c5h,)x; .ch=a
x.n x.ch
联合体类型(union)
所谓联合体类型,就是几个不同类型的变量共占同 一段内存的结构。
类型名1 共用体成员名表1; 类型名2 共用体成员名表2; …… 类型名n 共用体成员名表n; };
union u_type {
char c; int i; float f; };
联合体变量的定义
312、说先定明定义一义联个联合无合体名体类联类型合 型 的体再同类定时型义定,联义直合联接体合定变体义量变联量合体变量
} printf("%d\n",two);scanf("%d",&two);/*error*/
two=two+four;/*error*/
结构体数组
一个学生结构体类型(struct Student)变量一次 只能存储单个学生信息。如果程序中需要处理多名 学生的信息,则可以建立学生结构体类型数组。
学号(number)
20
printf("%c\n",p++->ch);
B
printf("%c\n",p->ch++);
C
for(p=a;p<a+3;p++)
printf("%d,%c\n",p->n,(*p).ch);
}
a[0] 110
'A'
a[1] 20
'B'
a[2] 30
'DC''
11,A 20,B 30,D
a[0].n a[0].ch a[1].n a[1].ch a[2].n a[2].ch
p
union u_type {
char c[2]; char c1; char c2; }; void main()
内存高地址 内存低地址
u1
‘b’
‘a’
c1 c2
c[1]
c[0]
u1占2个字节
{ union u_type u1,u2,*p=&u1;
内存高地址 内存低地址
u2
‘b’
‘‘aAB’’
u1.c[0]='a';u1.c[1]='b';
姓名(name)
wangwu lisi lili xulin
年龄(age)
20 19 20 21
性别(sex)
'M' 'M' 'F' 'M'
例:以下程序输出结果是? #include<stdio.h> void main() {
struct {
char x1; int x2;
a[0].x1 'A'
a[0].x2 1
a[1].x1 'B'
a[1].x2 2
a[2].x1 'C'
a[2].x2 3
}a[3]={'A',1,'B',2,'C',3};
printf("%d\n",a[0].x1-a[1].x1/a[2].x2);
} A)40
B)43 C)55
D)80
结构体和指针
1、指向结构体变量的指针
{
int x,y; }in;
e.b e.a
int a;
int b;
}e;
void main()
{
e.a=1;e.b=2;
e.in.x=e.a*e.b;
e.in.y=e.a+e.b;
printf("%d,%d",e.in.x,e.in.y);
}
A)2,4 B)1,2 C)8,4
e.in.x e.in
例如,在同一个地址开始的内存块中,分别存取字符型变量 、整型变量、实型变量的值(如图所示)。三种变量在内存中 占有不同的字节数,但都从同一地址开始存放,它们的值可 以相互覆盖。
内存高地址
内存低地址
字符变量c占1个字节 整型变量i占2个字节 单精度实型变量f占4个字节
联合体类型的声明
声明联合类型的一般形式: union [联合类型名] {
10,china 10,china 10,china
3、指向结构数组的指针
p
struct st
{
int n;
char ch;
};
main()
{
struct st a[3]={10,'A',20,'B',30,'C'},*p=a;
printf("%d\n",++p->n);
11
printf("%d\n",(++p)->n);
two.one.c1 ''Aa'' two.c 'B' 2
two.one.c1+=32;
printf("%d\n", ++two.x);
2
printf("%d\n", two.one.i);
1
printf("%d\n", sizeof(two));
6
printf("%d\n", sizeof(two.one));
勿忘分号
struct Student {
char number[11]; char name[8]; int age; char sex; };
结构体变量的定义
123、先定说定义明义结一结构个构体无体类名类型结型 的 构再同体定时类义定型结义,构结直体构接变体定量变义量结构体变量
struct Student
3
}
two.one
例:以下程序输出结果是?
struct date2
{ int i; char c;
}two,four; main() {
结构体变量名不代 表地址
(和数组名区别)
two.i
1
two.c
'A'
four.i
1
four.c 'A'
two.i=1;
two.c='A';
four=two;
printf("%d,%c\n", four.i,four.c);
struct 结构体类型名 数组名[常量表达式];
struct Student {
char number[11]; char name[8]; int age; char sex; };
struct Student
{
char number[11];
char name[8]; int age; char sex;
4、结构指针作为函数参数
struct st
{
int n; char ch; }; fun(struct st *y)
y
x 150
'Aa''
{
y->n+=5;
y->ch+=32;
printf("In fun:y->n=%d,y->ch=%c\n",y->n,y>ch);
}
In fun:y->n=15,y->ch=a
union u_type
{
内存高地址
内存低地址
char c; int i; float f; }u; 1,u2;
字符变量c占1个字节 整型变量i占2个字节 单精度实型变量f占4个字节
union u_type u1,u2;
sizeof(u1)=?
联合体变量的初始化
因为联合体中的成员同占同一段内存,它们的值可以相互覆 盖,所以联合体中的成员不能同时有意义。
s定型iz的义e同结of构时(s体创tu建类) 结构=体?数组
}stu[4];
struct Student stu[4];
结构体数组的初始化
与一般数组一样,在定义结构体数组的同时,可以给 其全部或部分元素赋初值,初值列表放在一对花括号内。
struct Student stu[4]={{"0208103321","wangwu",20,'M'},
printf("%c,%c\n",(*p).c1,p->c2);
u2=u1;
a,a
c1 c2
c[1]
c[0]
u2.c1='A';u2.c2='B';
u2占2个字节
printf("%c,%c\n",u2.c[0],u2.c[1]); B,b
}
例:以下程序输出结果是?
union example
{
struct
10 a.n
'A' a.ch
struct st
{
p
int n;
char ch;
};
main()
{
struct st a={10,'A'},*p=&a;
printf("%d,%c\n",a.n,a.ch);
printf("%d,%c\n",(*p).n,(*p).ch);
printf("%d,%c\n",p->n,p->ch);
C语言程序设计
用户自定义数据类型
结构体类型(struct)
数组由类型相同的元素组成,但有些数据类型 可能由性质不同的成员组成,这些成员相互关联组 成一个整体数据。
如一个学生的信息可能包括:
学号(number):char [11]
姓名(name): char [8] 年龄(age):int
wk.baidu.com
结构体类型
如:
struct Student
stu={"0208103321","wangwu",20,'M'};
number ‘0' ‘2' ‘0' ‘8' ‘1' ‘0' ‘3' ‘3' ‘2' ‘1' ‘\0' name ‘w' ‘a' ‘n' ‘g' ‘w' ‘u' ‘\0' ‘\0'
age
20
sex
‘M'
姓名(name)
年龄(age)
性别(sex)
0208103321
wangwu
20
'M'
0208103322
lisi
19
'M'
0208103323
lili
20
'F'
0208103324
xulin
21
'M'
可定义一个包含4个元素的一维数组,每个数组元素 的类型为学生结构体类型。
结构体数组的定义
定义结构体数组的语法格式:
在定义一个结构体变量时,系统将在内存中分配一块连续的 存储空间,用于存放结构体成员的数据,这块连续存储空间 的首地址称为结构体变量的指针。
定义指向结构体变量的指针的语法格式:
struct 结构体类型名 * 指针变量名;
struct st {
p
int n;
char ch;
};
struct st a={10,'A'},* p=&a;
{"0208103322","lisi",19,'M'},{"0208103323","lili",20,'F'},
{"0208103324","xulin",21,'M'}};
stu[0] stu[1] stu[2] stu[3]
学号(number)
0208103321 0208103322 0208103323 0208103324
结构体成员的引用
引用结构体变量成员的表示方式为:
结构体变量名.成员名
运算符“.”称为成员访问运算符,在C语言中它的运算符 优先级别是最高的。
struct Student {
char number[11]; char name[8];
stu1.age=20; printf("%d",stu1.age); 以下赋值语句是否正确?
相关文档
最新文档