函数的概念
-
函数分类
系统函数,即库函数,是由编译系统提供的,用户不必自己定义这些函数,可以直接使用他们,如我们常用的打印函数printf()
用户定义函数,用以解决用户的专门需要 -
函数的作用
省去重复代码的编写,降低代码重复率 -
函数的定义
返回值类型 函数名(参数列表) { 代码体 return 0; }
-
函数的使用
在不同函数中的变量名可以重名,因为作用域不同
函数定义中参数称为形参,也就是形式参数,没有具体的值
函数调用过程中传递的参数称为实参,实际参数,有具体的值
在函数调用结束之后,函数会在内存中销毁,在栈区自动销毁,函数中使用过的形参也会从内存中销毁。
形参和实参
形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。
实参出现在主调函数中,进入被调函数后,实参也不能使用。
实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能从形参传给实参
在调用函数时,编译系统临时给形参分配存储单元,调用结束后,形参单元被释放
实参单元与形参单元是不同的单元,调用结束后,形参单元被释放,函数调用结束返回主调函数后则不能再使用该形参变量。实参单元仍保留并维持原值
因此,在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数中实参的值。
函数的声明
函数的使用分为三个步骤:
1 函数声明
2 函数定义
3 函数调用
为什么有时候不用声明呢?这是因为被调函数定义在了主函数main()之前,这种情况下,不用声明也可以调用函数
如果被调函数定义在了主函数main之后,则需要进行函数声明操作,意在告诉主函数,没事,你调用吧,我会在后面定义这个函数的
在一个工程/项目中,函数的名字是唯一的,而且也是共用的,就是在一个文件中定义函数,在另一个文件中可以直接调用
函数声明可以多次,调用也可以多次,但是定义只可以一次。
在a.c文件中定义的方法a(),在b.c文件中需要调用方法a()的话,也需要在b.c文件中声明一下,告诉b.c我这个方法在外部声明过了,放心调用吧
函数声明时,extern关键字可以省略,形参名称也可以省略,留有形参类型就行了
声明函数的三种方式:
extern int add(int a,int b);
int add(int a,int b);
int add(int,int);
而变量的声明和函数的声明不一样,变量声明不会分配内存空间,定义变量的时候才会分配内存空间并赋值,可以说定义变量包括了声明变量和分配内存空间,赋值,所以说定义是声明,而声明不是定义
main()函数和exit()函数
main函数是主函数,是程序的入口,main函数执行到最后一个大括号,代表程序结束,
在main函数中return任意整数,也代表程序结束,程序就此结束,return语句后面的代码都不会执行
在非main函数中,return语句代表函数的返回值,而在非main函数中执行exit函数也可以直接使程序结束,exit后面的所有代码都不会执行
exit函数代表结束程序,无论在哪里调用都会直接结束程序,和main函数中的return一样的效果。
多文件编程
示例:
func.c文件代码:
int max(int a, int b){
return a>b?a:b;
}
head.h文件代码
extern int max(int a,int b);
main.c文件代码
#include <stdio.h>
#include "head.h"
int main(void){
int a = 10;
int b = 20;
int c = max(a,b);
printf("max = %d\n",c);
}
以上示例了多文件编程整个过程,将函数max()定义一个func.c文件中,将之声明在一个头文件head.h中,然后再main函数中引入头文件head.h就可以直接调用max()函数
防止头文件重复包含
当项目中头文件比较多的时候,经常会在一个头文件中导入另一个头文件,但是如果写的时候忘记了,发生你导入我,我导入你的情况,程序就会一直无限循环的导入这两个头文件,发生报错,解决此问题有两种办法:
-
办法一:
在头文件第一行添加#pragma once
意思是防止头文件重复包含
但是此种办法只适用于windows系统,不适用与Linux系统 -
办法二:
使用:#ifndef XXX #define XXX .....声明语句 #endif
在定义头文件时,经常会一个.c文件,对应一个.h文件,例如上面功能的代码常常会这样定义头文件
func.c
int max(int a, int b){ return a>b?a:b; }
func.h
#ifndef __FUNC_H__//常用定义方法 #define __FUNC_H__ int max(int a, int b); #endif
main.c
#include <stdio.h> #include "func.h" int main(void){ int a = 10; int b = 20; int c = max(a,b); printf("max = %d\n",c); }