函数的封装(main.c bubble.c bubble.h)以冒泡算法为例
main.c主函数实现
#include <stdio.h>
#include <stdbool.h>
#include "bubble.h"
int main(int argc, char const *argv[])
{
int array[] = {5,4,3,2,1};
int len = sizeof(array) / sizeof(array[0]);
bubble(array, len);
for(int i = 0; i < len; i++)
printf("%d\t",array[i]);
printf("\n");
return 0;
}
bubble.c是存放冒泡算法
#include <stdbool.h>
#include <stdio.h>
bool bubble(int *array, int lenght)
{
if(array == NULL || lenght <= 0)
{
return false;
}
for(int i = 0; i < lenght-1; i++)
{
for(int j = 0; j < lenght-i-1; j++)
{
if(array[j] < array[j+1])
{
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
return true;
}
bubble.h是冒泡算法的函数声明
bool bubble(int *array, int lenght);
编译程序不能使用快捷键,需要命令编译
gcc main.c bubble.c -o main.exe
执行程序
./main.exe
gcc编译原理
1.将c文件进行预编译,作用是将头文件里面的内容进行展开,就是将头文件的内容拷贝到main函数上面
gcc main.c -o main.i -E
2.生成汇编程序,作用是将c文件编译成更加底层的编程语言汇编程序
gcc main.i -o main.s -S
3.将汇编程序生成未链接的可执行程序
gcc main.s -o main.o -c
4.将未连接的可执行程序生成已链接的可执行程序
gcc main.o -o main.exe
C进程内存布局
详细内容见下
堆内存
堆是唯一可被开发者自定义的区段,开发者可以根据需要申请内存的大小、决定使用的时间长短
相关API:
-
申请堆内存:malloc() / calloc()
-
malloc不会清空,有一些随机数要手动清空,可以用msmset()赋值,以字节为单位
-
calloc()则不用
-
清零堆内存:bzero()
-
释放堆内存:free() 只能释放堆内存,并且只能释放整块堆内存
realloc()扩容,在原来的基础上
函数指针(非常重要)
概念
-
函数指针变量,就是用来保存函数地址的变量
-
函数名相当于这个函数的首地址
int func(int a, int b);
// 函数指针,指向的函数类型为返回值为int 参数为(int,int)的函数
int (*pfunc)(int a, int b);
回调函数(必须掌握)
调用一个函数,这个函数传递函数指针,被调用的的这个函数通过这个函数指针进行调用其他函数,我们把这种方式称为回调函数
递归函数
什么时候用到递归 : 需要满足有规律递减条件,递减到某个程度是可以退出的
func()
{
func()
}