一、数据类型
1.结构体
1.如何创建结构体数据类型
// 定义结构体语句struct 结构体名字{属性 1 ;属性 2 ;属性 3 ;.......};//( 学生 ) 集合属性 :1. 姓名 char name [ SIZE ]; // 字符数组和字符串是标配2. 身高 int height ; // 基本数据3. 三门成绩 float scores [ 3 ]; // 数组// 定义一个学生的结构体struct student{char name [ 20 ];int height ;float scores [ 3 ];};//表示你定义一个结构体数据类型,该数据类型名字叫struct
2.如何创建结构体变量
3.如何访问变量的值
4.如何操作结构体的指针
// 定义一个指向 int 的指针int * pi = NULL ; //sizeof(pi)=8 pi+1 sizeof(int)// 定义一个指向结构体 (struct student) 的指针struct student * ps = NULL ; //sizeof(ps)=8 ps+1 (struct student)
2.内存管理
3.在堆区分配空间和释放空间
1.分配空间
#include <stdlib.h>// 参数 : 你要分配空间的大小// 返回值 :void * void ( 表示空 ) void * ( 任何数据类型的地址 )// 分配成功返回空间的首地址,失败则返回 NULL//malloc 分配的空间未进行清空void * malloc ( size_t size );
2.释放空间
#include <stdlib.h>
//
参数
1:
释放空间的首地址
void
free
(
void *
ptr
);
4.结构体和堆区空间关联起来
1.在堆区创建5个存结构体的空间
#include <stdio.h>
#include <stdlib.h>
#define N 20
#define M 3
#define SIZE 5
//该句话是前两句话的简化
typedef struct student
{
char name[N];
int height;
float scores[M];
}Stu;
int main(void)
{
Stu * ps=NULL;
//1.分配空间
//再堆区创建5个存结构体的空间
ps=(Stu *)malloc(sizeof(Stu)*SIZE);
//2.出错判断
if(NULL==ps)
{
perror("malloc error");
return -1;
}
//3.释放
free(ps);
ps=NULL;
return 0;
}
2.编写一子函数,对ps指向的空间进行输入和输出
#include <stdio.h>
#include <stdlib.h>
#define N 20
#define M 3
#define SIZE 5
//该句话是前两句话的简化
typedef struct student
{
char name[N];
int height;
float scores[M];
}Stu;
void menu(void);
void menu(void)
{
printf("1---------input\n");
printf("2---------output\n");
printf("3---------calPMaxheight\n");//获得身高最高人的地址
printf("4---------calpMinheight\n");//获得身高最低人的地址
printf("5---------swap(Stu *pMax,Stu * pMin)\n");//获得身高最低人的地址
printf("6---------sortByHeight\n");//按照身高排序
printf("7---------sortByName\n"); //按照姓名排序
printf("8---------sortBySumScore\n");//按照总分排序
printf("-1--------exit\n");
printf("请输入选项\n");
}
//编写一子函数,实现对ps指向的空间进行输入
//参数1:该空间的首地址 Stu * ps
//参数2:元素的个数 int n
//返回值:void
void input(Stu * ps,int n);
void input(Stu * ps,int n)
{
//输入
int i=0,j=0;
for(j=0;j<n;j++)
{
printf("请输入姓名,身高,三门成绩\n");
scanf("%s",ps->name);
scanf("%d",&ps->height);
for(i=0;i<M;i++)
{
scanf("%f",&ps->scores[i]);
}
ps++; //自增到下一个学生的首地址
}
}
//编写一子函数,对ps指向的空间进行输出
//参数1:该空间的首地址 Stu * ps
// 参数2:元素的个数 int n
// 返回值:void
void output(Stu * ps,int n);
void output(Stu * ps,int n)
{
int i=0,j=0;
for(j=0;j<n;j++)
{
//输出
printf("%10s",ps->name);
Day5
1.讲解作业
printf("%5d",ps->height);
for(i=0;i<M;i++)
{
printf("%5.0f",ps->scores[i]);
}
printf("\n");
ps++;
}
}
int main(void)
{
int op=0;
Stu * ps=NULL;
//再堆区创建5个存结构体的空间
ps=(Stu *)malloc(sizeof(Stu)*SIZE);
if(NULL==ps)
{
perror("malloc error");
return -1;
}
while(1)
{
menu();
scanf("%d",&op);
if(-1==op) break;
switch(op)
{
case 1:
input(ps,SIZE);
break;
case 2:
output(ps,SIZE);
break;
}
}
free(ps);
ps=NULL;
return 0;
}
5.共用体
6.大小端
//测试计算机是大端序还是小端序
#include <stdio.h>
union un
{
int a;
char c;
};
int main(void)
{
union un u1;
u1.a=0x12345678;
if(u1.c==0x78)
{
printf("小端序\n");
}else
{
printf("大端序\n");
}
return 0;
}
7.枚举:(语义化)定义常量的一种方式
//1. 定义一个枚举的数据类型enum timeDate{MONDAY = 1 , TUESDAY , WEDSDAY , THURSDAY , FRIDAY // 默认是从开始的整数};// 定义一个枚举数据类型 , 该数据类型的名字叫 enum timeDate//2. 定义枚举的变量enum timeDate d1 ;d1 的值可以是 MONDAY , TUESDAY , WEDSDAY , THURSDAY , FRIDAY 任意一个
8.字节对齐:分配空间时候一次性分配多少个字节
1.基本类型:自然对齐方式:
2.结构体的对齐方式:成员当中最大的那个
9.位域(位段)
#include <stdio.h>#define N 20typedef struct mydate{unsigned int year : 11 ; //int 的 11 位 :unsigned int month : 4 ;unsigned int day : 5 ;} Date ; // 缺点 : 不能通过 scanf() 输入typedef struct student{char name [ N ];int height ;Date birday ;} Stu ;int main ( void ){Stu s1 = { "zhangsan" , 183 ,{ 2000 , 9 , 9 }};printf ( "%10s %5d " , s1 . name , s1 . height );printf ( "%04d/%02d/%02d\n" , s1 . birday . year , s1 . birday . month , s1 . birday . day );printf ( "sizeof(Date)===%ld\n" , sizeof ( Date ));return 0 ;}
10.递归
1.数的阶乘
2.斐波那契数列