小言_互联网的博客

C语言学习第五节

398人阅读  评论(0)

一,动态内存

动态内存 堆内存 在某一次申请过程中 内存肯定是连续的
手动申请 手动释放
void *malloc(size_t size);
//申请size个字节大小的动态内存
//如果失败返回 NULL
void calloc(size_t nmemb,size_t size);
//申请 nmemb个size字节大小的 内存 总共:nmemb
size个字节
void *realloc(void *ptr,size_t size);
//调整动态内存的大小
//切记 接收其返回值
返回申请得到的动态内存的首地址
通过首地址加偏移量来访问动态内存
void free(void *ptr);
//释放动态内存

内存泄露: 申请的动态内存没有及时释放

二,预处理指令

gcc编译C语言程序的步骤:
1.预处理
-E 进行预处理工作
工作内容: 进行预处理(预处理指令),进行宏替换和头文件导入或者条件编译等
去掉注释内容
不会自动生成文件
-o 可以指定生成的目标文件 .i

2.编译
-S 检查语法错误 生成汇编程序
工作内容: 检查源代码或者经过预处理之后代码的语法错误
生成汇编程序 .s
3.汇编 其实是用as命令
-c
工作内容: 把汇编代码汇编成目标文件(二进制)
生成目标文件 .o
4.链接 其实是用ld命令
链接一个或者多个目标文件生成可执行程序 默认是a.out
工作内容: 链接函数调用
语法错误检查:在编译阶段
函数调用检查:在链接阶段
-l 选项:链接的库 数学库 -lm
-I
-D
-O
预处理指令
在预处理阶段就会进行处理的指令
以#开头的指令
#include 包含头文件
导入头文件中的代码
调用了标准库的函数时需要导入头文件
#include <> 与 #include ““的区别
<> 从系统指定的路径(可配置)搜索包含的头文件
“” 从当前目录搜索包含的头文件,
如果在当前目录下没有找到,则去系统指定的目录下搜索
如果是包含自己写的头文件时用””,包含标准库的一般用<>
#define
宏名 一般用大写字母
宏定义 在预处理阶段进行简单的宏替换
#define PI 3.14
宏函数
#define POW(x) ((x)(x))
预处理阶段不进行运算 只进行替换
注意:
不要在宏定义后面加上 ;
宏函数需要给每个参数都加上小括号 以及最后整体加上小括号 避免产生歧义
宏函数和参数列表之间不能有额外的空格
#define POW (x) ((x)
(x)) //错误 POW和(x)之间多了一个空格
定义一个宏
计算一年有多少毫秒 不用关心闰年
#define MSOFYEAR (3652460601000)L
\ 可以连接宏定义
一般而言 宏只能放在一行 但是可以通过 \ 来连接多行 作为同一个宏定义
# 可以把一个标识符变成一个字面值字符串
#define TOSTR(x) #x
#define print(x) printf(#x"=%d\n",x)
## 可以生成新的标识符
宏的作用:
1.方便修改
2.简化编程
3.参数没有类型限制 灵活
条件编译:
分支选择语句
只有当执行时才确定执行哪一个分支 会把两个分支的语句都编译到代码中去
移动计费系统
浙江 湖南 江西
都是同一套软件
编译时 可以选择 编译的代码
#if 根据宏的值来进行条件编译
#elif
#else #否则
#endif #条件编译结尾
#ifdef #if defined 如果定义了某个宏 用宏是否定义来进行条件编译
#ifndef 如果没有定义某个宏
#undef 删除一个宏 取消宏定义

#ifdef ZBS
//如果定义了 ZBS 这个宏 则编译该分支
#else
//如果没有定义 ZBS 这个宏 则编译些分支
#endif

#ifdef LINUX
//linux系统代码
#endif

#ifdef LINUX //如果定义了LINUX宏
//linux系统代码
#else //没有定义
//其它系统代码
#endif
宏可以在代码中用 #define 定义
也可以在编译时用 -D 宏名称 来定义宏
根据宏的值:
#if N==1

#elif N==2

#elif N==3

#else //宏没有定义 以及不满足上面情况下编译

#endif
#ifdef/#ifndef/#if defined #endif //宏是否定义来进行条件编译
#if /#elif #endif //宏的值来进行条件编译
多文件编程:
头文件 .h 文件
需要把函数的声明放在.h文件中
实现文件放在.c文件中
头文件卫士: 用于防止多次引用该头文件
如果不加 程序稍微复杂一些就可能引发重复定义的错误
#ifndef XXX_H__
#define XXX_H__

#endif //XXX_H__


转载:https://blog.csdn.net/yux111/article/details/102488390
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场