函数基础知识:
定义:
一个可以完成特定功能的代码模块 函数可以实现代码的复用
三要素:功能 参数 返回值
格式:存储类型 数据类型 函数名(参数)
{
//逻辑代码 函数体
}
函数的特点:
- 函数不调用不执行
- 函数调用多次就会执行多次
函数调用:函数名(参数);
#include <stdio.h>
#include <string.h>
int fun()
{
// 输出今天周五
printf("今天周五\n");
}
int main(int argc, char const *argv[])
{
// 调用
fun();
fun();
fun();
fun(); //调用了4次,输出4次
return 0;
}
定义函数时会出现以下几种情况:
1.参数
- 定义时有参数,那么函数名后的小括号需要按照定义变量的方式定义参数
调用时函数名后的小括号也要传递相应个数和类型的参数
- 没有参数,定义时没有参数 那么调用时也不需要写参数
2.返回值
- 有返回值,在内部需要书写return进行数据返回,需要将函数名前面的数据类型定义成和返回值相同
- 无返回值,函数需要定义成void类型
3.定义子函数时如果写在主函数的下面,需要先声明再调用
函数的声明: 存储类型 数据类型 函数名(参数);
参数的分类:
- 形参:定义函数时写在函数小括号内的参数
用来接收实参的传值的
- 实参:函数调用时写在小括号内的参数
用来给形参传递值的(给形参赋值)
注意:形参的个数要和实参的个数一一对应(数据类型也要对应)
练习:
使用函数实现计算两个数的和 返回结果
返回值return:
作用:
- 返回数据给外界
- 阻断代码的执行 结束当前函数
函数的传参:
1.值传递
单向传递(实参--->形参)修改形参的值 实参不会发生变化
2.地址传递
双向传递 修改形参的值 实参会发生变化
地址传递本质是一个值传递
3.数组传递
开辟堆区空间:
堆区的特点
由我们程序员随时申请,由我们自己随时释放。
堆和栈的主要区别有:
1、 栈由系统自动分配,而堆是人为申请开辟;
2、 栈获得的空间较小,而堆获得的空间较大;
3、栈由系统自动分配,速度较快,而堆一般速度比较慢;
4、栈是连续的空间,而堆是不连续的空间是随机分配的。
malloc
#include <stdlib.h>
void *malloc(size_t size);
功能:开辟堆区空间
参数: size:开辟空间的大小
返回值:任意类型的指针 开辟成功后空间的首地址 失败:NULL
释放堆区空间
free
#include <stdlib.h>
void free(void *ptr);
功能:释放堆区空间
参数:ptr:要释放的堆区空间的地址
返回值:无
int *p = (int *)malloc(sizeof(int) * 3); // 12
if (p != NULL)
{
printf("%p\n", p);
}
else
{
printf("error\n");
}
free(p);//释放堆区空间
p=NULL;//指针置空
注意:
- 手动开辟堆区空间,要注意内存泄漏
- 使用完堆区空间后及时释放空间 指针要及时置空