函数是对功能的封装,引入函数概念是为了提高代码复用和可读性。
C语言函数可以分为三种:主函数,库函数,和自定义函数。
主函数
主函数在C语言中有且只有一个,所有的程序都是从主函数开始执行,在主函数中结束。
库函数
库函数本身不是C语言的一部分,但是支持标准C的实现会提供该函数库的函数声明,类型和宏定义。
常用的库函数分为以下几个部分 标准输入输出函数(如getchar getline scanf putchar printf),字符串函数(strcpy,strcmp)数学函数(sin cos pow sqrt)实用函数(atof,atoi)其他函数(不常用)
自定义函数
自定义函数是最常用的函数。一般分为声明和定义。
函数定义的一般格式是
返回值类型 函数名(参数声明)
{
声明部分
语句序列
}
C语言是顺序编译的,只有后面的函数才可以调用前面定义的函数,有时候一个文件里函数太多,函数顺序不好确定,这时候我们需要在前面声明函数,这样就可以不受限制的调用函数。
声明的格式如下
返回值 函数名(参数声明);
需要注意的是C语言中声明的格式必须和定义保持一致(返回值,函数名,参数表)
参数传递
C语言的参数传递是传值操作,及传递给函数的只是当前值的副本,对其改变不会影响传入的值
#inlcude<stdio.h>
void PassValueTest(int a, int b){
a = a+b;
printf("a =%d\n",a);
}
int main(){
int a =3, b=5;
PassValueTest(a,b);
printf("value = %d\n",a);
}
如果需要改变传入变量的值,比如数据交换函数swap,那么我们需要用到指针方面的知识。传入地址值来间接改变该地址对应的值。
#include<stdio.h>
void swap(int*a, int*b){
*a=*a^*b;
*b=*a^*b;
*a=*a^*b;
}
int main(){
int a=3, b=5;
printf("a=%d,b=%d\n",a,b);
swap(&a,&b);
printf("a=%d,b=%d\n",a,b);
getchar();
}
文件组织
函数过多时我们会遇到在一个文件中管理大量代码的问题,这会给我们修改该文件带来大量问题,如函数不好定位,非修改部分被意外修改等等, 这时候我们需要用到头文件相关的知识。我们通常把主函数单独放在mian.c 中将其他函数按照功能分类放到其他.c 文件中,在同名的.h文件中添加该函数的声明,通过include 命令来处理文件之间的包含关系。
#include 命令会在编译前宏扩展的时候把对应文件添加到当前语句的位置,以完成文件组织,说白了就是在编译器眼里所有的文件都是一个文件,文件组织的意义就是人为的分割函数,以提升可读性和安全性。
常用的文件组织相关命令和关键字如下
extern
#include
#if
#ifndef
#define