C语言学习第六节

一,多文件编程

多文编程的步骤:
1.写一个 .h 文件
头文件卫士
函数声明 类型声明 声明全局变量(不是定义)
2.写.c文件用于实现 .h文件中声明的函数
需要包含 .h 文件 #include “”
检查语法错误: gcc -c x.c //只编译和汇编 只检查语法错误 并不会链接
生成 .o 文件
3.写一个.c 文件里面 写 main函数 调用其它函数
gcc -c main.c
gcc *.o 链接所有的目标文件 生成 可执行程序
头文件也可以检查语法错误
gcc -c xx.h 生成 xx.h.gch
删除.gch文件
#include “xx.h”
如果有 xx.h.gch 不会去导入 xx.h
为什么要多文件编程:
1. 分工合作 协作
2. 让函数更方便重复调用
3. 更有利于项目的开发 和 管理
extern 用来声明在其它文件中定义过的全局变量 函数
声明
编译步骤:
1.预处理
-E
去除注释 预处理(宏替换 条件编译 文件导入)
2.编译
-S
检查语法错误 生成汇编代码
3.汇编
-c
把汇编代码汇编成机器代码(目标文件)
4.链接
链接函数 链接库 main函数 生成可执行代码
预处理指令:
以#开头
预处理阶段就进行处理
#include <> #include “” 区别
头文件卫士 :防止头文件被多次引用
#ifndef XXX_H__
#define XXX_H__
函数声明
全局变量声明 extern
自定义类型
#endif //XXX_H__
#define 宏 宏函数
注意: 不能画蛇添足 不能加分号
#define N 3
宏函数的参数在使用时要加小括号
宏函数不要有多余的空格
使用宏函数时不应该用自增减的参数
#ifdef #ifndef #else #endif
#if #elif #else #endif
#undef
头文件里的内容:
1. 头文件卫士
2. 函数声明
3. extern变量声明
4. 定义宏
5. 定义类型

有的时候可以直接把函数的实现写在.h文件中,但不建议这样做

二,结构体

结构体
数组: 一组同类型数据的集合
结构体:一组类型不定的数据的集合
数组: 直接声明变量 int arr[10];
结构体:先声明定义结构体类型
struct 结构体名字{
成员类型 成员名字;

};
有了结构体类型之后 可以声明变量
struct 结构体名字 变量名;
struct Stu s;
数组: 数组通过下标的方式进行访问数组元素 数名名[下标]
结构体:每一个结构体变量访问元素都是通过 成员名字 来访问
结构体变量名.成员名字
数组: {}
结构体:{}
保存一个学生的信息
姓名 年龄 性别 成绩 …
char name[24] = “张三”
int age = 11;
char gender = ‘F’;
int score = 98;
1. 定义结构体的语法 定义结构体类型 混合类型
struct 结构体名{
//成员类型 成员名字;

};
struct Emp{
int id;
char name[24];
int age;
double salary;
};
2. 定义结构体变量
struct Emp (结构体类型)
struct Emp e;
struct Emp e1,e2;
3. 结构体变量的初始化
struct Emp e = {110,“王五”,18,3290.3};
//值与声明结构体成员时一一赋值
结构体变量如果不初始化,结构体变量的每一个成员都是垃圾值
部分成员初始化(部分成员,仅限从第一个成员开始) 剩下自动"零"
= {} 直接全部初始化为"零"
结构体变量一旦定义定义,不可以再使用= {}的形式进行赋值操作
4. 结构体变量访问成员
结构体变量定义之后 ,只能通过
结构体变量.成员名字 的形式进行单独访问和操作
e.id = 110;
//e.name = “张三丰”; 成员name是一个数组
strcpy(e.name,“张三丰”);
5. 结构体成员变量是数组的情况
如果要访问必须通过 结构体变量.成员名字[下标] 形式来访问
struct Stu{
int id;
char name[24];
int scores[3];
};
struct Stu s = {};
s.scores[0] = 100;
6. 结构体数组
结构体
结构体:不同类型的元素集合 先需要自定义结构体类型
访问元素: 通过变量.成员名字
{值的顺序和要结构体成员声明顺序一致}
只能在初始化时用{} 后面整体赋值不可以再使用{}
数组: 相同类型的元素集合 直接定义变量 变量[下标]
{从前往后}
定义结构体类型
struct 结构体名字{
成员类型 成员名字;

};
定义结构体类型变量
struct 结构体名字 变量名 = {};
结构体变量初始化
struct 结构体名字 变量名 = {成员值,…};
. 结构体变量取成员值 运算符
结构体数组
结构体指针
结构体指针 访问成员 p->memb;
(*p).memb;
结构体变量可以互相赋值
仅仅是值相等 不同的两个变量
结构体指针变量
结构体指针变量名->成员名字 直接访问该指针指向的结构体的成员值
结构体对齐补齐
对齐摆放:
结构体的成员都是从自身长度整数倍的位置开始存储
超过4按4对齐摆放
补齐长度:
结构体的长度必须是最长成员长度的整数倍
最大成员长度超过4按4的倍数补齐
位域: 已经淘汰了
结构体成员按二进制位存储
struct A{
char a:2;
char b:3;
char c:2;
};
struct B{
char a:2;
char :3;//空域
char c:3
};
sizeof: 取决于最大的成员 二进制位数
位域
本质上是结构体 但每个成员只占若干个二进制位
空域
联合 union
联合中所有的成员使用(共享)同一块内存
存储的大小端问题
对其中一个成员进行赋值,其它成员也一并有值
联合的大小取决于联合中字长最宽的成员类型
枚举 enum
枚举的本质其实是int
枚举值的值是多少
所谓的枚举值 UP,DOWN,LEFt,RIGHT其实本质上还是int数值
如果不给枚举值指定特殊的值,从0开始递增1
如果给枚举值指定值那么该枚举值就固定,没有指定值的枚举值等于有指定过的值开始递增
enum COL{RED,YELLOW,GREEN=-1,GRAY,BLACK=5,BLUE};
enum DIR{UP,DOWN,LEFT,RIGHT};
C语言中枚举值和int可以相互赋值
大端 和 小端 机器存储数据的方式
大端: 低地址存储高字节数据 阅读习惯
小端: 低地址存储低字节数据
复合类型:结构体struct 枚举enum 联合union

你可能感兴趣的:(C语言学习第六节)