3、函数的参数
3.1实际参数
真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。
但注意:无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
3.2形式参数(形参)
形参是指(定义函数)函数名括号中的变量,因为形参只有在函数被调用的过程中才实例化(分配内存单元),所以叫形参。形参当函数调用之后就自动销毁了。因此形参只在函数中有效。
补充说明:
(1)形参与实参类型一致、顺序对应、个数相同
(2)在被定义的函数中,必须指定形参的类型
(3)若形参与实参类型不一致,自动按形参类型转换
(4)形参与实参占用不同的内存单元,单向传递(实参传给形参)
例:写一个函数交换两个整形变量的内容
//代码1 #include<stdio.h> void swap(int x, int y) { int tmp = x; x = y; y = tmp; } int main() { int a = 0; int b = 0; //输入 scanf("%d %d", &a, &b); //用函数交换a和b的值 swap(a, b);//调用函数 printf("%d %d\n", a, b); return 0; }
但是我们运行之后发现,并没有成功。
只是为什么呢?
调试
实参a和b
形参x,y
使用的不是同一空间(地址不同)
当函数调用的时候,实参传递给形参,这时形参是实参的一份临时拷贝,对形参的修改不影响实参。 (即形参实例化之后其实相当于实参的一份临时拷贝)
那我们怎么可以实现交换呢?这就是我接下来要讲的函数调用。
4、函数调用
4.1 传值调用
4.2 传址调用
4.1传值调用
函数的形参和实参分别占用不同内存块,对形参的修改不会影响实参。
4.2传址调用
1、传址调用是把函数外部创建变量的内存地址传递给函数参数(形参)的一种调用函数的方式。
2、这种传参方式可以让函数和函数外边的变量建立真正的联系,也就是函数内部可以直接操作函数外部的变量。
注:1、在一个函数中可以多次调用其他函数,在调用语句中的函数名必须与函数定义中的函数名相同。
2、实际参数应与被调用函数定义中的形式参数个数相同、位置对应并且类型一致。
3、被调用函数必须存在
真正实现两个数内容的交换:传址调用
#include<stdio.h> //pa--指针变量(用来存放地址的) //*pa解引用操作-作用就是通过pa中的地址,找到a void swap(int* pa, int * pb) { int tmp =*pa;//*pa就是a *pa= *pb; *pb = tmp; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); //用函数交换a,b swap(&a, &b); printf("%d %d\n", a, b); return 0; }
注:地址是固定的,不能修改。