首页 理论教育 C语言程序设计教程|函数参数和返回值详解

C语言程序设计教程|函数参数和返回值详解

时间:2023-11-01 理论教育 版权反馈
【摘要】:这时要求函数带回一个确定的值以参加表达式的运算。④“函数返回值”与“函数返回”是两个不同的概念。前者是指非void类型函数,被调用后,带回到调用函数中的结果;后者表明,被调用函数执行完毕后,必定要返回调用函数。

C语言程序设计教程|函数参数和返回值详解

1.函数参数

函数的参数分为形式参数(形参)和实际参数(实参)。形参用变量表示,出现在函数定义中。实参用常量或已经赋值的变量或能计算出结果的表达式表示,出现在主调函数中。形式参数只是形式上占一个位置,没有具体的值,只有在调用该函数时,才由实际参数给它传递具体的值,形参与实参的功能是作数据传递。

(1)函数定义

函数定义的一般形式如下:

[函数存储类型] 函数返回值类型 函数名(类型名 形式参数1,…, 类型名 形式参数n )

说明:

① 函数的存储类型有以下两种类型:

● extern类型 说明该函数能被其他程序文件中的函数调用,该类型是默认存储类型。

● static类型 说明该函数只允许被所在程序文件的其他函数调用。

② 函数的返回值类型有int、char、float、void等。若在函数定义时省略了函数返回值类型,则系统默认函数返回值的类型为“int”;若函数只是用于完成某些操作,没有函数值返回,则必须把函数定义成void类型。

③ 函数名和形参都是由用户命名的标识符。在同一程序中,函数名必须唯一,形参名只要在同一个函数中唯一即可,与其他函数中的变量可以同名。

④ 形式参数的类型与变量的类型相同。形式参数可以有零个、一个或多个。当形参为零个时称为无参函数,形参为一个或多个时称为有参函数。

⑤ 函数体也称为语句序列。一般函数的函数体含有一条或多条语句,只有空函数的函数体不含任何语句。

⑥ 不能在函数体内再定义函数。

⑦ 在C语言程序中,一个函数的定义可以放在任意位置。既可以放在主函数main之前,也可以放在主函数main之后。

(2)函数的声明和调用

① 函数声明

函数在调用之前需要在调用函数中先声明。对函数进行声明,能够使C语言的编译程序在编译时进行有效的类型检查,以防止可能出现的错误

函数声明的两种形式如下:

类型名 函数名(参数类型1, 参数类型2, …) ;

类型名 函数名(参数类型1 参数名1, 参数类型2 参数名2, …) ;

说明:

● 函数声明语句中的类型名必须与函数返回值的类型一致。

● 函数声明语句可以是一条独立的语句,也可以与普通变量一起出现在同一个类型的定义语句中。

例如:

int add(int, int); //函数的声明是一条独立的语句

int x, y, add(int, int ); //函数的声明与普通变量在一起

在程序设计中,经常将函数声明作为一条独立的语句出现在调用函数中。例如,在下面程序段的main函数中,使用一条独立的语句对max函数进行声明。

● 函数声明的位置

函数声明可以放在所有函数定义之前,此时被声明的函数在这个C语言程序文件的任何函数中都能被调用。

函数声明也可以放在调用函数的内部说明部分。此时被声明的函数只能在调用函数的内部被调用,在调用函数的外部不能被调用。

● C语言规定有以下两种情况,可以在调用函数中省略对被调用函数的声明。

如果被调用函数的定义出现在调用函数之前,则在调用函数中可以省略对被调用函数的声明。例如,在上例的main函数中,可以省略对max函数的声明。

如果被调用的函数的返回值是整型字符型时,则可对被调用函数直接调用,而不需要对被调用函数进行声明。这时系统虽然会在编译时给出警告信息但是连接会正常进行,程序运行时系统将自动对被调用函数返回值按整型处理。

② 函数的调用

调用函数的形式如下:

函数名(实参表列)

在实参表列中,多个实参之间要用逗号隔开,实参的个数、顺序、类型与对应形参的个数、顺序、类型一致。若调用无参函数,函数名后的括号不可省略。

按函数在程序中出现的位置来分,可以有以下三种函数调用方式:(www.xing528.com)

● 函数表达式。调用的函数用于求值时,调用函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。

例如:

c=2*max(a,b);

函数max是表达式的一部分,它的值乘2再赋给c。

● 函数参数。调用的函数作为一个函数的实参,这种实参称为函数参数。

例如:

s=sum(a, max(c,d));

其中max(c,d)是一次函数调用,它的值作为函数sum调用的实参。s的值是a与函数max值作为实参的sum函数的返回值。

说明:函数参数的调用方式,实质上也是“函数表达式”调用方式中的一种,因为函数的实参本来就可以是表达式形式。

● 函数语句。函数仅可进行某些操作而不返回函数值,这时调用的函数可以作为一个独立的语句。

例如:

把调用的函数作为一个语句时,不要求函数带回值,只要求函数完成一定的操作。

③ 函数调用时的语法要求

函数调用时有以下4种语法要求:

● 调用函数时,函数名必须与所调用的函数名字完全相同。

● 实参的个数、顺序、类型必须与形参的个数、顺序、类型一致。如果类型不匹配C语言编译系统按赋值兼容的规则进行转换。

● 函数必须先定义后调用。

● 函数可以直接或间接的调用自己,称为递归调用。

2.函数返回值

函数运行结束后,要返回到主调函数中。

函数有返回值时,该值通过return语句返回一个值,形式如下:

return 表达式; 或 return(表达式) ;

说明:

① return语句中的表达式的值,就是所求的函数值。此表达式值的类型必须与函数首部所说明的类型一致。若类型不同,系统将自动转换为函数首部说明的类型。每个函数至多可以返回一个值,但可以有多条return语句。

② return语句中也可以不含表达式,但此时必须将函数定义为void类型。这时,return语句的作用只是将程序的流程返回到调用函数,并没有确定的函数值带回。

③ 函数体内可以没有return语句,但此时也必须定义函数为void类型。这时,程序的流程就一直执行到函数末尾,然后返回到调用函数,也没有确定的函数值带回。

④“函数返回值”与“函数返回”是两个不同的概念。前者是指非void类型函数,被调用后,带回到调用函数中的结果;后者表明,被调用函数执行完毕后,必定要返回调用函数。

3.函数间的参数传递

C语言中参数传递均采用单向值传递,即将实参的值复制到形参中。但被复制的值可能是变量、数组元素或表达式的值,也可能是地址值。这样在C语言程序中调用有参函数时,参数传递的方式就有值传递和地址传递两种方式。

(1)值传递方式

值传递方式的特点是调用函数将实参数据复制到被调用函数对应的形参中,数据传递是单向的,即只有实参传给形参,而不能由形参传回来给实参。

在执行一个被调用函数过程时,形参的值如果发生改变,并不会改变调用函数中实参的值。形参的值不会使对应的实参数据发生变化。当形参是变量时,而实参是对应类型的变量或数组元素或表达式时,将采用值传递的方式传递数据。

(2)地址传递方式

地址传递方式的特点是调用函数将实参的地址复制到被调用函数对应的形参中,对形参的操作实际上是直接引用实参所有存储单元,形参值的改变会导致实参值的相应变化。例如:

scanf("%d", &x);

这里的“&”运算符是求变量x的地址,&x作为实参,其作用是将从键盘输入的值写入系统为变量x分配的内存单元里。

当形参是数组名或指向数组的指针时(将在第6章介绍指针),实参是对应类型的地址、指针、数组名、函数名或函数指针时,将采用地址传递方式传递数据。

调用无参函数时,不发生参数传递。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈