函数
函数的定义和调用
函数的概述
函数的作用:
将一段经常使用的代码封装起来,减少重复代码
一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能
函数的定义
函数的定义一般主要分为 5 个部分:
- 返回值类型:一个函数可以返回一个值,这里标明返回值的数据类型
- 函数名:给函数起一个名称,不能和关键字一样
- 参数列表:使用该函数时,传入的数据
- 函数体语句:花括号内的代码,函数内需要执行的语句
- return 表达式:和返回值类型挂钩,函数执行完后,返回相应的数据
如:
返回值类型 函数名 (参数列表)
{
函数体语句
return 表达式
}
函数的调用
语法:函数名(参数)
注意:调用函数时,传入的实际参数称为实参,而定义函数时,参数列表里称为形参
函数的声明
函数声明的概述
声明的作用:
告诉编译器函数名称及如何调用函数,函数的实际主体可以单独定义
声明语法:
返回值类型 函数名 (参数列表);
如:
int max(int a,int b); // 函数的声明
int max(int a,int b) // 函数的定义
{
return a > b ? a : b; // 三元运算
}
函数声明的注意事项
- 函数的声明可以多次,但是函数的定义只能有一次
- 假如函数在 main 中调用
- 如果函数的声明写在 main 函数之前,函数的定义可以写到 main 函数之后
- 那么此函数可以调用成功
- 如果函数未写声明或者函数的声明写到 main 函数之后,且函数的定义也写在 main 函数之后
- 那么此函数调用失败
函数的分类
函数的分类方式一
从定义的角度分类:
函数分为库函数和自定义函数
库函数:
由 C 系统提供,用户无须定义,也不必在程序中作类型说明,只需在程序前包含该函数原型的头文件即可在程序中直接调用,如 printf、scanf等等
自定义函数:由用户按需要编写的函数
函数的分类方式二
从参数和返回值的角度分类:
- 无参无返:
void f1(){}
- 有参无返:
void f2(int a){}
- 无参有返:
int f3(){ return int类型数据 }
- 有参有返:
int f4(int a){ return int类型数据 }
函数的值传递
函数的值传递概述
概述:
值传递,就是函数调用时实参将数值传递给形参
特点:
值传递时,如果形参发生改变,并不会影响实参
函数的值传递案例
#include <stdio.h>
#include <stdlib.h>
// 值传递时,形参不可以修改实参
void swap(int a, int b)
{
printf("交换前:\n");
printf("a = %d\n", a); //10
printf("b = %d\n", b); // 20
int t = a;
a = b;
b = t;
printf("交换后:\n");
printf("a = %d\n", a); //20
printf("b = %d\n", b); // 10
}
int main()
{
int a = 10;
int b = 20;
swap(a, b);
printf("实际是:\n");
printf("a = %d\n", a); // 10
printf("b = %d\n", b); // 20
system("pause");
return EXIT_SUCCESS;
}
函数的分文件编写
分文件编写步骤
作用:
让代码结构更加清晰,功能模块分离
步骤:
- 创建后缀名为 .h 的头文件
- 创建后缀名为 .c 的源文件
- 在头文件中写函数的声明
- 在源文件中写函数的定义,并包含 .h 头文件
分文件编写示例
- 创建 maxs.h 头文件。写函数的声明
int add(int a,int b); // 加
int sub(int a,int b); // 减
- 创建 maxs.c 源文件,写函数的定义,并包含头文件
#include "maxs.h"
int add(int a,int b)
{
return a + b;
}
int sub(int a,int b)
{
return a - b;
}
使用文件中的函数
使用步骤:
- 在 main 函数的文件中,包含自定义的 .h 头文件
- 调用自定义文件中的函数即可
如:
#include “maxs.h”
int main()
{
int a = 10;
int b = 10;
printf( "a + b = %d\n",add(a,b) );
printf( "a - b = %d\n",sub(a,b) );
}
防止头文件重复包含
头文件重复包含:
如有文件 a1.h,a2.h
在 a1.h 中编写代码 #include "a2.h"
在 a2.h 中编写代码 #include "a1.h"
在 main.c 中编写代码 #include "a1.h"
此时编译器会报错;
c1014 包含文件太大:深度 = 1024
注意:都是写在最上方
解决方式1:
在所有自定义 .h 头文件最上面编写代码:#pragma once
解决方式2:
在 自定义.h 头文件
#ifndef _xxx_
#define _xxx_
代码语句
#endif
如:
#ifndef __TEST__
#define __TEST__
......函数的声明
#endif // ! __TEST__