1.引入
现实世界中的物体要 抽象成 计算机语言中的类型才能被计算机识别
属性---->数据类型
学生:
学号 int
性别 char
姓名 char name[20]
自定义类型:结构体、共用体、枚举
2.结构体
2.1定义格式
struct 结构体名
{
成员列表 ; // 数据类型 成员变量名
};
“结构体名”:C语言合法的标识符即可
数据类型 :C语言合法的数据类型
成员变量名:C语言合法的标识符即可
例子:
struct student
{
int No;
char sex;
char name[20];
};
struct student stu1;
struct student表示的是数据类型,stu1表示变量名
struct student *stu1;stu1表示指针变量名,struct student表示指针变量要指向的数据类型。
2.2内存中的存放
1.结构体类型所占的内存是各成员变量的内存之和
ps:1.结构体分配的空间按变量的定义顺序各自分配空间
2.内存对齐,与最长的对齐或者4的整数倍取一个最小
2.3结构体变量的引用
struct student stu1;
1.结构体类型名.成员变量名
stu.No=100;
int b=stu.No;
struct student *p;
2.结构体变量名->成员变量名
1)p=&stu1;
2)p=(struct student *)malloc(sizeof(stu1));
p->No=10;
例:#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
int No;
char sex;
char name[20];
};
int main()
{
struct student stu;
stu.No=100;
//stu.name="123";
strcpy(stu.name,"234");
printf("%s\n",stu.name);
struct student *p;
p=(struct student*)malloc(sizeof(struct student));
p->No=10;
return 0;
}
2.4结构体的初始化
1.对前面顺序的n个进行初始化
struct student stu1={11401,'M',"zhangsan"};
2.对任意进行初始化
struct student stu1={
.No=123,
.name="zhangsan",
.sex='M',
};
3.结构体数组初始化化
struct student stu[5]={ {.name="zhangsan"},{},{},{},{} };
2.5 struct
{
int a;
int b;
}A,B,C;
A,B,C为变量名,类型为 struct {int a,int b};
typeof(A) D;
3.联合体
union 共用体名
{
成员列表;// 成员数据类型 变量名
};
例:union a
{
char c;
int a;
};
联合体分配的空间是最大数据类型长度的空间。
#include<stdio.h>
union a
{
int a;
char c;
};
int main()
{
union a da;//union a:表示数据类型 da 变量名
printf("%d",sizeof(da));//结果为4 最大类型长度
return 0;
}
大端模式:低地址存高字节的内容,高地址存低字节的内容
小端模式:低地址存低字节的内容,高地址存高字节的内容
4.枚举
把一个变量所有可能的值列举出来
定义:enum 枚举名{可能的值};
ps:1.枚举的值默认为一个整型常量,默认处理为0,1,2,3....
2.枚举常量mon=4是错误的的,不可对它进行改变
3.enum day{one=8 ,two,three};那么one后面对应的整型常量就应该为9 10 ...
#include<stdio.h>
enum weekday{mon,tue,wed};
enum day{one=10 ,two,three};
int main()
{
enum weekday wd;//enum weekday :数据类型 wd是变量名
wd=mon;//mon tue wed默认为枚举常量,不可改变
wd=4;
//mon =5;
printf("%d\n",wd);
enum day dy;
dy=two;
printf("dy=%d\n",dy);
return 0;
}
ex1.写一个代码,判断是大端模式还是小端模式?
ex2.从屏幕上输入5个学生成绩、学号、姓名,按成绩大小输出学生的成绩、姓名、学号
struct student
{
int grade;
int NO;
char name[20];//char *name
};
1.用scanf输入 struct student stu[5];
2.排序
3.输出