一、结构体:不同数据类型的集合(区别数组:同一类型数据的集合)
#include<stdio.h>
#include<string.h>
struct student//struct 是结构体关键字,student是结构标记 struct student结构体类型名字,不会分配空间,类似int ,float
{
int age;//student 类型结构体的成员
char name[20];
char sex;
}stu1,stu2;//结构体变量,不能将结构体变量变量作为整体输出,输入。
void main()
{
stu1.age = 20;
//stu1.name = 'm';error,成员访问符不能进行数组访问,只能访问数字或字符
strcpy(stu1.name ,"Liu");//若要访问字符串可以用strcpy函数进行赋值。
stu1.sex = 'm';
struct student stu1 ={19, "dsld"};//对整个结构体进行初始化必须一一对应赋值,不能省缺。
struct student stu2 = {20,"nihao"};
}
定义结构体有三种方式:
a.先定义结构体类型,再定义结构体变量赋值
struct student
{
...
};
struct student stu1,stu2;
b.定义结构体类型的同时,就定义结构体变量
struct student
{
…
}stu1,stu2;
c.可以不定义类型名,直接定义结构体变量
struct
{
...
}stu1,stu2;
1.结构体类型定义结束后,才可对结构体变量进行初始化。不能给结构体类型成员初始化。
2.不能对结构体变量进行输入输出操作,只能对成员进行操作用成员访问符(.)进行操作。
3.结构体类型不会分配内存,结构体变量才会分配内存(类型int a =5;int实际不占内存,变量a占四个字节)。
4.对结构体可以各个赋值,也可以整体赋值。各个赋值可以每个成员赋值,整体赋值必须一一对应。
若各个赋值必须注意对字符串的赋值,要调用strcmp函数。
strcmp(char1,"char2")---->该函数比较两个字符串,相等返回0,char1>char2返回>0的数 char1<char2返回小于0的数。
strcpy(stu1.name ,"Liu");-->该函数是字符串copy函数,把Liu 复制给stu1.name。
strcat(char1,"char2");--->该函数是字符串catnate函数,把char2连接在char1后面。
5.定义数组封号不能少。
6.%2d,输出有效字符数为2,右对齐。%-3d,左对齐。
二、结构体数组
1.其定义和结构体定义一样(3种)
struct student
{
…
}stu[3];
对其中元素引用strcpy(stu[0].name, "liu");
2.指向结构体变量的指针
struct student
{}stu[3];
struct student* p;
p = &stu[0];
注意:p要指向结构体数组成员的成员要进行强制类型转换、
p = (struct student *)stu[0];
三、联合体也叫共用体 union
1.不同的数据类型"共享"一个区域内存,它采用了覆盖技术,允许不同数据类型覆盖,但不能同时处理所有成员,每一瞬间只能处理一种类型数据,占用内存,按占字节最大者开辟空间。
2.改变其中一种类型的值,可能影响到其他类型成员。
union stu
{
char a;
int b;
}stu1;
void main()
{
stu1.a ='A';
stu1.b++;
printf("A' = %c",stu1.a);//A'= B
}
四、枚举类型enum
1.enum :是数据类型,而不是构造数据类型
定义:是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内
enum <枚举标记> {枚举常量1,枚举常量2。。。。。};
五、typedef :
1.typedef:用户自定义类型说明符(关键字)
typedefchar NAME[20];
NAME a;//等价于char a[20];NAME是一个字符数组类型,并且字符大小为20字节,然后用NAME 定义变量。
2.typedef是给已有数据类型取"别名",可以是int,float,可以是结构体,通常为大写字母,以封号结尾。
typedefint INTEGER;//把int 型定义成INTEGER, 所以 INTEGER a = 5等价于 inta=5;
typedeffloat PEAL;
typedefunion
{
char a;
int b;
}STU,*PORT;
//把union定义成STU1,所以STU stu1 等价于 union stu stu1;
//把union定义成* PORT,所以PORT stu2等价于union student *stu2
3.typedef与#define的区别,#define是个字符串起个别名,typedef是个数据类型取别名,但两者有本质差别。
#define MAX_SIZE 5//没有封号宏定义
typedefint INTEGER;//必须加封号类型定义
INTEGER num;