------- Java培训、Android培训、iOS培训、.Net培训 、期待与您交流 --------
一函数的定义与分类
1.函数:C源程序有函数组成,函数是C源程序的基本模块,通过对函数模块的调用实现特定功能。
2.分类
从函数定义的角度
1)库函数 由C系统提供,用户无需定义,也不必在程序中作类型说明,只需要在程序前包含有该函数的头文件即可在程序中直接使用。例如:printf scanf getchar gets....
2)用户自定义函数 用户按需要写的函数,对于此不仅要在程序中定义函数本身,而且在主调函数模块中必须对该被调函数进行类型说明,然后才可以使用。
从语言的函数兼有其他语言中的函数和过程两种功能的角度,又可分为:
1)有返回值函数 被调用执行完毕后将向调用者返回一个执行结果。
2)无返回值函数 用于完成某项特定的处理任务,执行完毕后不必向调用者返回一个执行结果。也就是void类型函数。
从主调函数和被调函数之间数据传送的角度
1)无参函数 函数定义,函数说明,函数调用中均不带参数,主调函数和被调函数之间不进行参数传递,此函数通常用来完成一组指定的功能,可以返回和不返回函数值。
2)有参函数 函数定义,函数说明都有参数,称为形参。函数调用中也必须给出参数,称为实参。进行函数调用时,主调函数将把实参的值传递给形参,供被调函数使用。
3.自定义函数的书写:
返回值类型 函数名称(函数参数){
函数体;
}
1)无参无返回值
void 函数名(){
语句;
}
2)无参有返回值
返回值类型 函数名( ){
语句;
return;返回给主调函数
}
3)有参无返回值
void 函数名(形参列表例如:int n){
语句;
}
注意:形参列表的格式:(类型变量名,类型变量名......)
其中,n称为形参变量名,它的作用域从定义的位置开始,到函数的"}"结束。
4)有参有返回值
返回值类型函数名(形参列表){
语句;
return 返回值类型变量或常量;
}
!!!注意:用户自定义函数,函数名不能重名。
二 形参和实参
形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。
1.形参:定义函数的时候,函数名后面小括号中的参数,就是形参。形参是什么样类型的数据,那么实际参数也必须是什么样类型的数据。函数内部不可以定义与函数形参同名的变量,因为形参与函数的代码是一个代码块。
2.实参:调用函数时,函数名后面小括号中的参数。它出现在主调函数中。形参和实参的功能是做数值的传递。函数在调用时,主调函数把实参的值传递给被调函数的形参从而实现主调函数向被调函数的数据传递。
3.注意:
a.形参定义后,并不会立即分配存储空间,在函数调用的时候才会真正的分配存储空间。
b.如果有多个形参,用逗号分隔。
c.形参的类型可以不一致。
d.函数内部不可以定义与函数形参同名的变量,因为形参与函数的代码是一个代码块。
e.实参可以是常量,变量,也可以是表达式
4.函数参数的传递过程
形参变量只有在被调用的时候才分配内存单元,在调用结束时,立马释放所分配的内存单元。形参只在函数内部有效,函数调用结束返回主调函数后则不能在使用该形参变量。
实参可以是常量,变量,也可以是表达式,无论是合何种类型,在进行函数调用时,他们都必须具有确定的值。
实参和形参必须在数量上,类型上顺序上一致。
形参的值在函数内部可以被修改,但是不会影响主调函数中实参的数据。
5.函数的返回值:被调函数返回给主调函数的数值
注意:函数返回值的关键字:return
return 常量,return表达式,return a=5,return a>5,return a+b,return a,return 0;
如果return的值和函数定义的类型不一致,以函数的返回值类型为准。
如果函数返回值为整型,函数定义时可以省去类型说明,但是在开发中尽量不要省略。
#include<stdio.h>
void max(int x,int y){
int x;//和形参同名
return x>y?x:y;
}
int num(int x,int y){
return x+y;
}
int main(int argc,const char * argv[]) {
printf("%d\n",num(23,34));//嵌套 num返回给main的值
return0;
}
三 函数的声明和定义
1.声明定义:在主调函数中调用某函数之前,要对被调函数进行说明。目的是为了使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。
格式:返回值类型被调函数名(类型 形参,类型形参...);
返回值类型被调函数名(类型 ,类型 ...);
流程:声明--->定义--->调用
注意事项:如果被调函数的返回值是int类型,此时可以不用声明
如果被调函数写在了主调函数之前,此时可以不用声明
2.函数调用
格式:函数名(实际参数表);实参可以是常量,表达式,也可以是变量。
注意:函数调用作为另外一个函数的实参
函数名不能和变量名同名
例如:
#include <stdio.h>
//此处定义了一个有参数有返回值函数
int max(int x,int y){
return x>y?x:y;
}
int main(int argc,const char * argv[]) {
void test1();//声明
test1();//调用
int a=34,b=12;//实参可以是整形常量
int m=max(34,12);
m=max(a,b);//实参可以是变量
m=max(a+3,b+5);
m=max(a=a+3,b++);//实参可以是表达式
m=max(max(56,67), 120);//嵌套函数调用作为另外一个函数的实参
printf("%d",m);
return0;
}
void test1(){
printf("test1\n");
void test2();
test2();
}
void test2(){
printf("test2\n");
}