一、结构体
结构体:是一种自定义的构造数据类型
用途:把不同类型的数据组合成一个整体。
结构体类型定义:
struct [结构体名]
{
类型识别符 成员名;
类型识别符 成员名;
……
};(记住分号不可少)
eg:
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[20];
}stu1,str2;(stu1,stu2为结构体变量)
说明:
结构体类型与结构体变量概念不同
类型:不分配内存 变量:分配内存;
类型:不能赋值、存取、运算 变量:可以;
结构体变量中的成员可单独使用,方法如普通变量;
结构体可嵌套;
eg:
struct date
{
int month;
int day;
int year;
};
struct student
{
int num;
char name[20];
struct date birthday;
}stu;
结构体成员名与程序中变量名可相同,两者不代表同一个对象。
结构体变量的引用:
引用规则
结构体变量不能整体引用,只能引用变量成员
结构体变量名.成员名。
stu.age = 20;
结构体的正确用法:
1 #include<stdio.h> 2 void main() 3 { 4 struct student 5 { 6 int No; 7 float score; 8 char name[20]; 9 }stu; 10 scanf("%d,%f,%s",&stu.No,&stu.score,&stu.name); 11 printf("%d,%2.2f,%s",stu.No,stu.score,stu.name); 12 }
结构体初始化的方式:
(1)struct 结构体名
{
类型标识符 成员名1;
类型标识符 成员名2;
};
struct 结构体名 结构体变量={初始化数据};
(2)struct 结构体名
{
类型标识符 成员名1;
类型标识符 成员名2;
}结构体变量={初始化数据};
结构体数组:
具有相同结构的结构体也可以组成数组
定义结构体数组:三种形式
(1)间接定义
struct student
{
int num;
char name[20];
int age;
char sex;
};
struct student stu[2];
指向结构体类型数据的指针
存放结构体首地址
结构体的运算按照C语言的地址运算原则进行,
例如,结构指针加1,将指向内存中下一个结构体
指向结构体变量的指针
定义形式: struct 结构体名 *结构体指针名;
struct student { int num; char name[20]; char sex; int age; }stu; struct student *p = &stu;
结构体变量指针的使用,以下三种形式时等价的:
stu.num = 101;
(*p).num=101;//括号不能少
p->num=101;
用法举例:
1 #include<stdio.h> 2 #include<string.h> 3 void main() 4 { 5 struct student 6 { 7 long int num; 8 char name[20]; 9 char sex; 10 float score; 11 }stu_1,*p; 12 p=&stu_1; 13 stu_1.num = 89001; 14 strcpy(stu_1.name,"lilei"); 15 (*p).sex = ‘M‘; 16 p->score = 89.5; 17 printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n",(*p).num,p->name,stu_1.sex,p->score); 18 }
二、共用体
共用体概念:
构造数据类型,也叫联合体
用途:使几个不同类型的变量共占一段内存(相互覆盖)
类型定义形式:
union 共用体名
{
类型标识符 成员名;
类型标识符 成员名;
};
eg:
union data
{
int i;
char ch;
float f;
}a,b,*p,d[3];(与结构体类似)
说明:共同体变量任何时刻只有一个成员存在。共用体变量定义分配内存,长度=最长成员所占字节数
共用体变量的引用方式
三种方式等价:
共用体变量名.成员名
共用体指针名->成员名
(*共用体指针名).成员名
共用体类型数据的特点:
(1)同一个内存段可以用来存放几种不同的成员,但在每一瞬间,只能存放其中一种,而不是同时存放几种
(2)共用体变量中起作用的成员是最后一次存放的成员
(3)共用体变量和它的各成员的地址都是同一地址
三、枚举类型
枚举类型时ANSI C新标准所增加的。
如果一个变量只有几种可能的值,可以定义为枚举类型。所谓枚举是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。
枚举类型及其变量的定义形式:
enum 枚举类型名 {枚举元素列表} 枚举变量列表;
可以先声明类型再定义变量,或同时进行或直接定义变量。
eg:
enum weekday {sun,mon,tue,wed,thu,fri,sat};
enum weekday workday,week_end;
或
enum weekday {sun,mon,tue,wed,thu,fri,sat} workday,week_end;
其中,sun,mon……sat等为枚举元素或枚举常量。它们时用户定义的标识符。
说明:
在编译时,对枚举元素按常量处理,它们不是变量,不能对他们赋值。
枚举元素作为常量,它们时有值的,语言编译按定义时的顺序使他们的值为0,1,2……
枚举值可用用来做判断比较:
eg:
if(workday == mon)……
if(workday >sun)……
一个整数不能直接赋给一个枚举变量,应该先进行强制类型转换才能赋值。
eg:workday = (enum weekday)2;
四、用typedef定义类型
功能:用自定义名字为已有数据类型命名
类型定义简单形式:typedef type name;
type:已有数据类型
name:给type定义的别名
说明:
1、typedef没有创造新数据类型
2、typedef时定义类型,不能定义变量
3、typedef与define不同
typedef定义类型步骤:
1、按定义变量方法写出定义体 如 int i;
2、将变量名换成新类型名 int INTERGER;
3、最前面加typedef 如typedef int INTERGER
4、用新类型名定义变量 如 INTERGER i,j;
类型定义可以嵌套