一.函数参数的分类
实际参数(实参):
指真实传给函数的参数,叫做实参。实参可以是:变量、常量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定值,以便将这些值传送给形参。
形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才能实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后会自动销毁。因此形式参数只在函数中有效。
为了让我们更加直观的了解这两个参数的区别我们将昨天的代码作为示例。代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void change(int *pa, int *pb){
int tmp = 0;
tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main(void){
int a = 10;
int b = 40;
printf("a=%d b=%d\n",a,b);
change(&a,&b);
printf("a=%d b=%d\n",a,b);
getchar();
return 0;
}
这里的:
change(&a,&b);
语句就是实参,我们可以看到这里将两个实际的参数 &a &b (&念作取地址)传入了函数change(),我们之前写过一个自定义函数求和的时候写过如下代码:
#include<stdio.h>
int Add(int x, int y){
int z = x + y;
return z;
}
int main(void){
int a = 30;
int b = 30;
int sum = Add(a, b);
printf("sum=%d\n",sum);
getchar();
return 0;
}
这里的Add(a,b)也是实参
而:
void change(int *pa, int *pb)
int Add(int x, int y)
中的int *pa , int *pb 与 int x, int y 则是形式参数,这里的两个参数当没有实参传入的时候是没有作用的,只有当实参传入后形参才能发挥作用,且形式参数的值将在使用完成后自动销毁,所以我们可以认为形参实例化后是实参的一份拷贝
二.函数的调用
函数的调用相信我们都已经很熟悉了,不管是库函数还是自定义函数我们都调用过,如以下代码就分别展示了调用库函数与自定义函数:
//调用库函数
#include<stdio.h>
int main(void){
printf("hello\n");
getchar();
return 0;
}
这里我们就调用了库函数printf()来进行输出
//调用自定义函数
#include<stdio.h>
int Add(int x, int y){
int z = x + y;
return z;
}
int main(void){
int a = 10;
int b = 30;
int sum = Add(a, b);
printf("sum=%d\n",sum);
getchar();
return 0;
}
这里的 Add(a,b) 就是调用了自定义函数Add();
下面我们再来看两种不同的调用方法:
1.传值调用
函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参。
2.传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量
我们先来介绍一下传值调用,我们还是拿上面的代码作为示例:
#include<stdio.h>
int Add(int x, int y){
int z = x + y;
return z;
}
int main(void){
int a = 10;
int b = 30;
int sum = Add(a, b);
printf("sum=%d\n",sum);
getchar();
return 0;
}
这里的 Add(a,b) 就是传值调用,将变量a的值与变量b的值传入函数Add();中
接下来我们再来看传址调用:
#include<stdio.h>
void change(int *pa, int *pb){
int tmp = 0;
tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main(void){
int a = 10;
int b = 40;
printf("a=%d b=%d\n",a,b);
change(&a,&b);
printf("a=%d b=%d\n",a,b);
getchar();
return 0;
}
顾名思义就是传入函数的内容是地址,这里的change(&a,&b); 就是传址调用语句,将a的地址与b的地址传入函数change();中
2023/8/8
王起舟