c语言中的函数
函数是具有特定功能的程序指令的集合,具备模块化设计,能够实现数据的输入,处理和输出等功能,最终实现代码复用的效果;
1.函数的定义
数据类型 函数名称 (形参列表){
函数体:函数功能指向语句指令集合。
return :函数结束语句;
}
数据类型:表示函数返回值类型,可以是构造类型,指针类型,没有返回值用void表示;
函数名称:函数模块访问名称;
形参列表:可以由0个,一个或者多个参数表示,每一个形参有两部分构成,数据类型,形参变量名,没有形参用void表示
void noParm()
{
printf("没有参数的函数方法");
}
int oneParm(int a)
{
printf("一个参数的函数方法");
}
2.函数的调用
函数的声明是在函数的定义的时候实现,函数的调用,如果函数有参数,根据参数的数据类型传参。
1 #include<stdio.h>
2 void noParm()
3 {
4 printf("noParm:%c\n");
5
6 }
7 int oneParm(int a)
8 {
9 printf("oneParm:%d\n",a);
10
11 }
12 int add(int a,int b)
13 {
14 return a+b;
15 }
16 int main()
17 {
//调用没有参数的方法
18 noParm();
//调用一个参数的方法
19 oneParm(3);
//调用2个参数的方法,
20 add(3,4);
21 printf("add:.%d\n");
22 }
2.1在同一文件中调用函数
不需要直接声明,直接在使用函数的文件中对需要使用的函数进行调用;
#include<stdio.h>
int add(int a,int b);//自动对使用的函数进行声明
int main()
{
//调用函数
printf("%d\n",add(3,4));
}
//定义一个两个数相加的函数
int add (int a,int b)
{
return a+b;
}
2.2在不同一文件中调用函数
优点:只对调用的函数进行声明,其他不做声明;
缺点:调用函数过多是,需要逐一对需要使用的函数进行声明,设计效率较低;
2.2.1直接声明
//function1.c
1 #include<stdio.h>
2 int add(int a,int b)
3 {
4 return a+b;
5 }
//在function2.c,调用function1.c的函数
1 #include<stdio.h>
3 extern int add(int a, int b);
4 int main()
5 {
6 printf("%d\n",add(3,4));
7 }
//在一个程序访问多个文件,需要同时编译 gcc function1.c function2.c然后输出./a.out
2.2.2使用头文件
使用者直接通过头文件来访问函数的方式,比较方便;
1.首先创建 fun.h文件
//首先创建 fun.h文件 vim fun.h
#ifndef _FUNC_H
#define _FUNC_H
//引用函数
extern int add(int a,int b);
#endifc
//固定三行防止头文件多次展开
//fun2.c
1 #include<stdio.h>
//引用func.h头文件
2 #include"func.h"
4 int main()
5 {
6 printf("%d\n",add(3,4));
7 }
//fun1.c
1 #include<stdio.h>
2 int add(int a,int b)
3 {
4 return a+b;
5 }
3.函数的参数传递
3.1值传参
值函数调用过程中。将实际参数值,复制拷贝给形式参数,形参和实参是独立存在,形参值的修改不会影响实参的值,形参值的修改不会影响实参的值,如果函数有返回值的时候,返回值的实现同样利用值传参实现。
1 #include<stdio.h>
2 int setVal(int value)
3 {
4 //21
5 printf("before : value= %d\n",value);
6 value =22;
//22
7 printf("after : value= %d\n",value);
8
9 }
10 int main()
11 {
12 int a=21;
13 setVal(a);
//21
14 printf("%d\n",a);
15
16
17 }
3.2地址传参
指的是将实参的地址复制拷贝传递给形式参数,形式参数是指针,指向的空间是实际参数空间,形参解引用访问的就是实际参数空间,可以通过形参修改实参数据;
可以通过形参修改实参数,可以实现形参返回输出数据,从而实现多个数据的输出;
如果需要通过形参改变的数据变量,实参的值,则传递数据变量的地址;
如果需要通过形参改变的指针变量实参的值,则传递指针变量的值;
//交换两个变量的值
1 #include<stdio.h>
2 void changeValue(int a,int b)
3 {
4 int temp;
5 printf("%d:a=%d,b:=%d\n",__LINE__,a,b);
6 temp=a;
7 a=b;
8 b=temp;
9 printf("%d:a:=%d,b:=%d\n",__LINE__,a,b);
10
11 }
12 int main()
13 {
14 int a=3;
15 int b=4;
16 changeValue(a,b);
17
18 }
//根据地址传参
1 #include<stdio.h>
2 void changeValue(int a,int b)
3 {
4 int temp;
5 printf("%d:a=%d,b:=%d\n",__LINE__,a,b);
6 temp=a;
7 a=b;
8 b=temp;
9 printf("%d:a:=%d,b:=%d\n",__LINE__,a,b);
10
11 }
12 void changeValue2(int *p,int *q)
13 {
14 int temp;
15 printf("%d:*p=%d,*q:=%d\n",__LINE__,*p,*q);
16 temp=*p;
17 *p=*q;
18 *q=temp;
19 printf("%d:*p=%d,*q:=%d\n",__LINE__,*p,*q);
20 }
21 int main()
22 {
23 int a=3;
3.3全局变量传参
指的是利用全局变量属性,实现多个函数之间的参数的传递,所定义的全局变量,可以在程序中的任意函数模块中访问,实现参数传递。
1 #include<stdio.h>
2 int val = 123;
3 void setVal(int myval)
4 {
5 val = myval;
6 }
7
8 void prtVal(void)
9 {
10 printf("val = %d\n", val);
11 }
12
13 int main()
14 {
15 prtVal();
16 setVal(222);
17 prtVal();
18 setVal(111);
19 prtVal();
20 setVal(333);
21 prtVal();
22 }