1. 定义
定义:一个完成特定功能的代码模块 可以实现代码的复用
格式:
存储类型 数据类型 函数名(参数列表)
{
//功能代码 函数体
}
2. 调用
使用:函数调用
函数调用:函数名(参数);
3.三要素
功能、参数、返回值
1)有参数的话正常在小括号中写参数
参数分类:形参 实参
形参:在定义函数时写在小括号中的参数,接收实参传递的数据
实参:调用时写在小括号的参数,给形参传递数据
int add(int a,int b)
{
printf("%d\n",a+b);
}
2) 没有参数:参数列表可以省略,也可以用void
int fun(void)
{
}
3) 有返回值:要根据返回值的数据类型定义函数的数据类型
int fun(void)
{
int a=101;
return a;
}
4)没有返回值:数据类型为void,函数内部没有return 语句。
void fun(void)//没有返回值
{
int a=101;
printf("12345678");
}
5) 定义子函数时可以直接定义在主函数上面,如果定义在主函数下面需要提前声明函数
int fun(void);
int main(int argc, char const *argv[])
{
fun();
return 0;
}
int fun(void)//形参
{
int a=101;
printf("12345678");
}
4. return的作用
- 返回return右边的数据给外界
- 阻断代码的执行
5. 函数传参
1. 值传递
实参-->形参(单向传递) 修改形参不会影响实参
2. 地址传递
双向传递 形参的改变会影响实参
3. 数组传递
和地址传递一样
6. 堆区空间
malloc
头文件: #include <stdlib.h>
void *malloc(size_t size);
功能:开辟堆区空间
参数:size:开辟空间的大小(字节)
返回值:成功:返回开辟成功的首地址
失败:NULL;
malloc free 搭配使用free
#include <stdlib.h>
void free(void *ptr);
功能:释放堆区空间
参数:ptr:要释放空间的地址
返回值:无
void *p = malloc(sizeof(int) * 4);
if (p == NULL)
{
printf("err\n");
}
printf("%p\n", p);
free(p);
p=NULL;
堆和栈的主要区别:
1、栈由系统自动分配,而堆是人为申请开辟;
2、栈获得的空间较小,而堆获得的空间较大;
3、栈由系统自动分配,速度较快,而堆一般速度比较慢;
4、栈是连续的空间,而堆是不连续的空间是随机分配的。
1.手动开辟堆区空间,要注意内存泄漏。当指针指向开辟堆区空间后,又对指针重新赋值,则没有指针指向开辟堆区空间,就会造成内存泄漏
2. 使用完堆区空间后及时释放空间
欢迎大家指正!!!