C语言补充

一、数据类型

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 20
typedef 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.斐波那契数列

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值