【C语言】函数的概念和函数的调用(参数传递)
文章目录一、函数的定义二、参数传递1.参数2.传递参数的方式3.函数调用一、函数的定义在C语言中,最基础的程序模块是函数。函数被视为程序中基本的逻辑单位,一个C程序是由一个main()函数和若干普通函数组成。定义一个函数的语法格式如下:返回值类型函数名([参数类型1 参数名1],[参数类型2 参数名2],[参数类型3 参数名3]...){函数体......return 返回值;}函数主要包含:返回
文章目录
一、函数的定义
在C语言中,最基础的程序模块是函数。函数被视为程序中基本的逻辑单位,一个C程序是由一个main()函数和若干普通函数组成。
定义一个函数的语法格式如下:
返回值类型 函数名([参数类型1 参数名1],[参数类型2 参数名2],[参数类型3 参数名3]...)
{
函数体
......
return 返回值;
}
函数主要包含:返回值类型、函数名、参数类型、参数、函数体、返回值
各部分解析:
- 返回值类型:用于限定函数返回值类型,当返回类型为void时,return语句可以省略。
- 函数名:表示函数的名称。
- 参数类型:用于限定调用函数时传入函数中的数据类型。
- 参数:用于接收传入函数的数据
- return关键字:用于结束函数,将函数的返回值返回函数调用处。
【注意】
如果函数不需要返回值,则函数的返回值类型应被定义为void,函数的返回值就可以省略。
[参数类型1 参数名1],[参数类型2 参数名2],[参数类型3 参数名3]...称为参数列表,如果函数不需要接收参数,参数列表为空,此时函数称为无参函数。
二、参数传递
1.参数
程序在编译或运行时,使用某个函数来完成相关功能,称之为函数调用。函数在被调用时,可以通过函数的参数列表,进行数据传递。函数中的参数有两种,分别为形式参数和实际参数。
(1)形式参数
在定义函数时,函数名后括号中的变量名称为形式参数或虚拟参数,简称“形参”。例如下面函数声明语句:
int func(int a,int b);
变量a和b就是形式参数,这样的形参并不占用实际内存,仅为了标识函数的参数列表而存在。
(2)实际参数
在函数被调用时,函数名后小括号内的参数称为实际参数,简称“实参”。实参可以是常量、变量、表达式。例如以下调用语句:
func(3,5);
此行代码是对函数func的调用,数据‘3’和‘5’分别对应参数列表a和b。当函数被调用时,形参是真正的变量,占用内存空间,此时具体的数据“3”和“5”就被传递给函数参数列表中的变量a和b。在函数调用时,形参获取实参的数据(相当于进行了赋值),该数据在本次函数调用时有效,一旦调用的函数执行完毕,形参的值就会被释放。
【注意】形参和实参的数据传递是单向的,只能是由实参传递给形参,不能由形参传递给实参。
2.传递参数的方式
传递参数的方式有:按值传递和按引用传递两种(值传递和地址传递)
- 按值传递实参时,程序会将实参创建一个副本,将这个副本传递给被调函数。对这个副本的修改不会影响到主调函数中原来参数变量的值。
- 按引用传递实参时,主调函数则会允许被调函数修改相应的实参变量的值。
若被调函数不需要修改主调函数中实参变量的值,则应采用按值传递的方式。这样可以防止意外的副作用(变量被修改)。
只有在被调函数需要修改主调函数中的变量而这个被调函数又是可信任的时候,才可以使用按引用传递。
【注意】C语言中,所有的实参都是按值传递。如果被传递的参数是一个数组名,并且在函数中使用下标引用该数组的参数,那么在函数中对数组元素进行修改实际上修改的是调用程序中的数组元素。函数将访问调用程序的数组元素,数组并不会被复制。这就是按引用传递,也就是“传址调用”。
数组的这一行为看似与按值传递规则相悖。但其实并不矛盾——数组名实际上是一个指针,传递给函数的是这个指针对一个副本。下标引用实际上是间接访问的另一种形式,这个副本上执行间接访问的是原先的数组。
案例演示:交换两个整数
1.值传递方式
#include <stdio.h>
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
printf("交换函数结果:a=%-5d b=%-5d\n", a, b);
}
int main() {
int a = 3, b = 4;
swap(a, b);
printf("主函数交换结果:a=%-5d b=%-5d\n", a, b);
}
运行结果:
结果分析:
由上面运行结果可知,调用swap函数后,只对副本a,b进行了交换,并没有修改实参的值。值传递不影响主函数中原来参数变量的值。
2.地址传递方式
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
printf("交换函数结果:a=%-5d b=%-5d\n", *a, *b);
}
int main() {
int a = 3, b = 4;
swap(&a, &b);
printf("主函数交换结果:a=%-5d b=%-5d\n", a, b);
}
运行结果:
结果分析:
向swap函数传递想要修改的变量a,b的指针,函数通过指针的间接访问操作,修改了a,b的值。
3.函数调用
(1)主函数调用普通函数
(2)嵌套调用
(3)递归调用:函数调用自身。
主函数可以调用普通函数,普通函数可以相互调用,但不能调用主函数。
当调用一个函数时,需要明确函数名和实参列表。要求实参和形参必须满足三个条件:参数个数相等、顺序对应、类型匹配
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)