预处理指令 头文件包含 #include 注意 “” <> 区别 <> 系统头文件 “” 自定义头文件 宏定义 不重视作用域 可以利用 #undef 卸载宏 宏常量 没有数据类型 宏函数 要注意表达式完整性 void test01(){#define MAX 1024 //#undef MAX} 条件编译 测试存在 #ifdef 测试不存在 #ifndef 自定义条件测试 #if //#de......
递归函数案例 函数自身调用自身,必须有结束条件退出循环 案例 实现字符串逆序遍历 //1、实现字符串逆序遍历void reversePrint(char * p){ if (*p == '\0') { return; //退出条件 } reversePrint(p + 1); printf("%c ", *p);}void test01(){ char * str = "abcdef"; reversePrint(str);}//2、实现字符串正序遍历void Posi
动态库配置流程 静态库优缺点 优点 : 生成的exe程序中包含了 静态库中的内容,与静态库无瓜葛 缺点 : 浪费资源 , 更新发布比较麻烦 动态库 运行阶段才去链接函数 配置流程: 创建项目 --- 配置属性 -- 常规 --- 配置类型 --- 动态库 重新生成解决方案,生成 .dll .lib 库文件 导入函数 只能在当前项目下使用 导出函数 可以在外部使用 __declspec (dllexport) int mySub(int a, int b); ...
静态库配置流程 创建项目 --- 配置属性 --- 常规 ----- 配置类型 --- 静态库 重新生成项目 ,创建出后缀名为 .lib的静态库文件 测试静态库重新生成解决方案 Ctrl+Shift+B在程序中直接使用静态库中的函数即可,此时会出现警告在程序中引入.h头文件即可...
函数指针的定义 先定义出函数类型,再通过类型定义出函数指针 typedef void(FUNC_TYPE)(); FUNC_TYPE * pFunc = func; 先定义出函数指针类型,再定义函数指针 typedef void(*FUNC_TYPE)(); FUNC_TYPE pFunc = func; 直接定义函数指针变量 void(* pFunc )() = func; 函数指针和指针函数的区别 //函数指针 是指向函数的 指针 //指针函数 函数的返回值是一个指针.....
链表的基本使用 带头节点链表 好处在于 头节点永远都是固定的 初始化链表 struct LinkNode * pHeader = init_LinkList () 遍历链表 void foreach_LinkList( struct LinkNode * pHeader ) 插入链表 void insertLinkList( struct LinkNode*pHeader , int oldval ,int newval ) 在oldval前插入 newVal,如果没有oldval就进行尾插 ...
链表的基本概念 链表引出 数组有缺陷 静态空间,一旦分配内存就不可以动态扩展,要不分配不够,要不分配过多 对于数组头部进行插入和删除效率低 链表的组成 链表是由节点组成的 节点由 数据域 和 指针域组成 struct LinkNode { int num ; struct LinkNode * next; } 链表的分类 方式1 静态链表 动态链表 方式2 单向链表 双向链表 单向循环链表 双向循环链表 ...
文件加密和解密实现 code.h#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>//加密void codeFile(char * sourceFile, char * destFile);//解密void deCodeFile(char * sourceFile, char * destFile);code.c#include"code..
配置文件读写 需求:将文件中的有效内容截取出来,并且放入到一个键值对的数组中 struct ConfigInfo { char key[64] ; char value[64] }; 获取有效行数 判断当前行是否有效 解析数据 parseFile 将有效数据放入到数组中,数组在堆区开辟 根据key获取value getInfoByKey 释放内存 freeSpaceconfig.h#pragma once#define _CRT_SECURE_NO_WARNINGS...
文件读写注意事项 当按照字符的方式读文件时候,通常利用判断EOF获取是否读到文件尾 当对自定义数据类型写入文件时,不要将指针写入到文件里,要将指针指向的内容写入#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>void test01(){ FILE * file = fopen("./test.txt", "r"); if (file == NU..
文件读写方式 按照字符进行读写 写文件 fputc 读文件 fgetc 文件结尾 EOF END OF FILE void test01(){ //写文件 FILE * f_write = fopen("./test1.txt", "w"); if (f_write == NULL) { return; } char buf[] = "hello world"; for (int i = 0; i < strlen(buf); i++) { fputc(...
内存对齐知识 内存对齐原因:以空间换时间 对于自定义数据类型对齐规则: //1、从第一个属性开始 偏移为0 //2、第二个属性开始,地址要放在 该类型整数倍 与 对齐模数比 取小的值 的整数倍上 //3、所有的属性都计算结束后,整体再做二次对齐,整体需要放在属性中最大类型 与 对齐模数比 取小的值的整数倍上 如果查看对齐模数 #pragma pack(show) 默认对齐模数 是8,可以将对齐模数改为 2的n次方 当结构体嵌套结构体时候,只需要看子结构体中最大数据类型就可以了...
结构体偏移量 可以利用offsetof来计算结构体中属性的偏移 也可以通过地址的相加运算 计算偏移量 结构体嵌套结构体#include <stddef.h>struct Person{ char a; // 0 ~ 3 int b; // 4 ~ 7};void test01(){ struct Person p1; struct Person * p = &p1; printf("b的偏移量为: %d", (int)&(p->b...