c语言中函数从用户的角度分为标准函数和用户自定义函数。
1) 标准函数(库函数)
用include将包含该函数的头文件包含进来。
2)用户自定义函数。
用户自定义函数由用户按需要编写的函数,分为函数定义和函数调用两部分。
函数有两个部分组成:函数首部和函数体。
函数首部只有一行,包含函数类型、函数名和形参类型说明表。
注意:函数首部没有分号“;”
函数体为包含在一对花括号中的说明部分和语句部分。
1)函数定义格式。
函数类型函数名(形参类型说明表)
说明部分。
语句部分。函数名为c语言的合法标识符,尽量与库函数名不同。
2)函数类型。
函数类型为函数返回值类型。
函数返回值类型可以为基本数据类型、结构体类型、指针类型。
1 函数返回值类型,如果为“int”,则可以缺省,若缺省则表示为“int”型。
2 不返回函数值的函数,函数类型定义为“空类型”,在函数类型处必须写“void”。
3)函数形式参数的声明。
函数参数定义形式:
类型形参1,类型形参2, …
1 形参个数和类型的设计应根据具体应用需要。
2 每个形式参数名前都要有类型说明,参数与参数之间用逗号“,”隔开。
3 如果是无参函数,则没有参数,但是括号“( 必须有。也可以在括号里写void,如:
int f();或者 int f(void);
无参函数不存在参数的传送,通常用来完成指定的功能。
(1)函数体定义。
函数体由一对花括号括起来,由说明部分和语句部分组成。
说明部分包含变量定义和函数声明。
语句部分是函数执行的语句。
2) 函数返回值与return语句的使用。
函数的返回值。
指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。
如果需要把被调函数的值带回主调函数,就需要使用return语句。
函数是否需要返回值,由具体应用决定。返回值由return语句实现。
return语句的一般形式如下:
return 表达式 ; 或者 return (表达式) ;或者 return ;
1 当执行return语句时,即使调用的函数主体中还有其他语句,函数执行也会停止。
2 return语句只能出现在函数体内,出现在**中的其他任何地方都会造成语法错误。
3 对于返回类型为void的程序,return;语句是可选的。
4 对于返回类型非void的程序,必须至少包括一条明确的return语句。
5 程序体可以包含不只一条,但只会执行其中的一个return语句,只能返回一个值,如果需要带回多个值,借助于指针或者外部变量实现。
6 函数返回值的类型应该与函数定义时的类型保持一致,若不一致,自动转换为函数定义时的类型。
函数要先定义后才能使用。
若定义写在调用位置之后,必须在调用位置之前用函数原型声明。
声明方式:函数类型函数名(形参类型说明表);
有以下三种情况可以不作函数声明,其他情况都必须进行函数声明:
1)定义写在调用位置之前。
2)函数返回值为int型。
3)在所有函数之前已经声明过。
所有的函数定义,包括主函数在内,都是平行的,也就是说,在一个函数体内,不能再定义另一个函数。
但是,函数之间可以相互调用,也可以嵌套调用,就是函数a调用了函数b,函数b又调用了函数c,还可以自己调用自己,即递归调用。
main函数可以调用其他函数,但是不能被其他函数调用。
若在函数a中调用函数b,则称a为主调函数,b为被调函数。
1)函数调用形式。
1)对于没有返回值的函数,即函数类型为“void”的函数,调用形式为:
函数名(实参1,实参2,……
2)对于有返回值的函数,调用形式为:
变量名=函数名(实参1,实参2,……
实参与形参个数相等,类型一致,按顺序一一对应,参数与参数之间用逗号隔开。
2)函数执行过程。
c程序必须有且只能有一个名为main的主函数,c程序的执行总是从main函数开始。
当执行到main函数中的函数调用语句时,程序会跳转到被调用函数定义体内,同时将主调函数中的值通过参数传递给被调函数,当执行到被调函数的return语句时或者最后一个语句后返回到主调函数。
3)函数调用方式。
1)函数语句。
在函数调用后加一分号构成函数语句。例如:
printstar();
printf("hello,world!");
2)函数表达式。
将函数调用的返回值作为操作数使用,构成表达式。例如:
m=max(a,b)*2;
3)函数实参。
将函数调用的返回值作为另一个函数的实际参数。例如:
printf("%d",max(a,b));
m=max(a,max(b,c));
4)函数调用和函数声明的区别。
1) 函数调用是函数的执行部分;函数声明是函数的说明部分。
2) 函数调用中使用的参数是实际参数,函数声明中的参数是形式参数,有时括号中只写参数类型即可。
3) 函数声明是为函数调用服务的,如果没有调用,就不需要声明。
1)形式参数。
形式参数是定义函数时使用的变量名,等待接收从主调函数传来的实际参数值,简称形参。
形参变量只有在被调用时才分配内存,调用结束,释放内存,只在函数内部有效。
2)实际参数。
实际参数是调用函数时用到的变量名,调用函数时函数名后圆括号中的常量、变量名、表达式或者函数。
当函数调用时,将主调函数中的该值传给被调函数,简称实参,已经在主调函数中定义过。
1 形参与实参类型一致,个数相同。
2 形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放。
形参与实参是数据传送的关系,是将实参传给形参。参数传递有两种形式:值传递和地址传递。
1)传数值。
值传递只是将实参的数值传给形参,如以下的参数传递都是值传递:
1)将常量或表达式的值传递给被调函数。
2)将基本类型变量的值传递给被调函数。
3)将数组元素的值传递给被调函数,数组元素作参数与普通变量是相同的。
4)将结构体变量中一个成员的值传递给被调函数。
5)将结构体变量全部成员的值传递给被调函数。
值传递是单向的,只能是实参传给形参,不能由形参传回实参,所以形参的值改变不会影响实参的值。
2)传地址值。
如果将实参的地址值传给形参,那么可以在被调函数中改变主调函数中的变量值。
地址传递主要有下面的两种形式:
1)通过指针实现地址传递。
将基本类型变量的地址、结构体变量的地址、基本类型数组元素的地址、结构体类型数组元素的地址传递给函数。
2)数组名作函数参数。
数组名表示数组的起始地址,当参数为数组时,传递的是实参的起始地址。
1 地址传递是双向的,将实参的地址传给形参,形参的值的改变会影响实参的值。
2 数组名作函数参数,在主调函数(实参)与被调函数(形参)中要分别定义数组,且类型必须相同。
3 实参数组和形参数组大小可以不一致,编译时只是将实参的首地址传递给形参,这两个数组共享同一内存空间。
在函数中对形参数组元素的操作,就是对实参数组元素的操作。
如果要求形参数组得到实参数组的全部元素值,则大小应一致。
4 形参若是一维数组,其大小可不指定,若是二维数组,第一维可不指定。
形参与实参类型一致,个数相同。若形参与实参类型不一致,自动按形参类型转换,这就是函数调用转换。
函数直接或间接的调用自身叫函数的递归调用。
递归调用就是在函数执行的过程中不断反复地调用函数自己,每调用一次就进入一个新的层次,每次调用都要返回到调用的地方,执行函数中未执行完的语句。
1 递归函数中每次调用,都要从头执行到未,被调函数执行完,返回到调用点继续执行。
2 在递归调用的过程中,最后调用的函数最先执行完,最先调用的函数最后执行完。
3 在递归程序中,一般没有循环结构。
1)函数嵌套允许在一个函数中调用另外一个函数,它是一个语言提供的程序设计的方法,也就是语言的特性。
2)递归就是函数调用自身,是函数嵌套的一个特例。
1 递归函数,问题本身要有递归性,即能把问题分解成与原问题相似,但层次较低的问题。
2 递归要有递归边界,必须要设定一个终止条件。到了边界,问题不再递归,可以直接得到结果,否则程序会不断递归下去直至崩溃。而嵌套函数就不用考虑这些。
3 递归是一种思想,只不过在程序中,就是依靠函数嵌套这个特性来实现了。
变量的作用域是指变量的有效性范围,即在某区域内有效。从变量的作用域来分,可以把变量分为局部变量和全局变量。
1)局部变量 (*
局部变量也称内部变量,局部变量在函数内部定义,只在本函数内有效。
1 main中定义的变量只在main中有效,主函数也不能使用其他函数中的局部变量。
2 不同函数中的同名变量,占用不同的内存单元。
3 函数的形参属于被调函数的局部变量,只在被调函数中有效。实参属于主调函数的局部变量,只在主调函数中有效。
4 可在复合语句中定义局部变量,只在该复合语句中有效。
2)全局变量 (*
全局变量也称外部变量,外部变量定义在函数之外,不属于哪个函数,属于整个程序。
全局变量的作用范围为从定义变量的位置开始到本源程序结束。
1 若外部变量与内部变量同名,则外部变量被屏蔽,内部变量起作用。
2 应尽量少使用外部变量,因为:
外部变量在程序全部执行过程中占用存储单元。
降低了函数的通用性、可靠性,可移植性。
降低程序清晰性,容易出错。
3 如果用extern加以说明,可以把外部变量的作用域扩大到定义处之前及其它源程序中。
外部变量说明格式如下:
extern 数据类型变量表;
2019投影5省二级C等级考试基础考点4 函数
c语言中函数从用户的角度分为标准函数和用户自定义函数。1 标准函数 库函数 用include将包含该函数的头文件包含进来。2 用户自定义函数。用户自定义函数由用户按需要编写的函数,分为函数定义和函数调用两部分。函数有两个部分组成 函数首部和函数体。函数首部只有一行,包含函数类型 函数名和形参类型说明...
2019投影5省二级C等级考试基础考点4 函数
c语言中函数从用户的角度分为标准函数和用户自定义函数。1 标准函数 库函数 用include将包含该函数的头文件包含进来。2 用户自定义函数。用户自定义函数由用户按需要编写的函数,分为函数定义和函数调用两部分。函数有两个部分组成 函数首部和函数体。函数首部只有一行,包含函数类型 函数名和形参类型说明...
2019云南省计算机等级考试二级 必备
1 不属于计算机数据处理的应用是 b a 管理信息系统b 实时控制。c 办公自动化d 决策支持系统。2 微型计算机硬件系统中最核心的部件是 b a 显示器b cpuc 内存储器 d i o设备。3 汉字在计算机内的表示方法一定是 b a 国标码b 机内码。c 最左位置为1的2字节 d ascii码。...