实参与形参:实参一般理解为定义函数外部定义的变量,而形参一般指定义函数内部的变量。
一.传值调用
函数的形参和实参分别占有不同的内存块,对形参的改变不会影响实参。
二.传址调用
传址调用是把外部变量的地址传给函数的方式。
这种方式可以让函数和外边的变量真正建立起联系,也就是函数内部可以直接操作函数外部的变量。
区分它们的一个实例就是交换函数:
#define _CRT_SECURE_NO_WARNINGS
#include
int swap(int x,int y)
{
int m = x;
x = y;
y = m;
}
int main()
{
int num1 = 10;
int num2 = 20;
printf("交换前的值分别是%d %d\n",num1,num2);
swap(num1,num2);
printf("交换后的值分别为%d %d\n",num1,num2);
return 0;
}
这个得到的结果为:
发现num1,num2的值根本就没有交换。原因出在哪呢?
其实上面就是只进行了传值调用造成的,swap(num1,num2)中的num1,num2就相当于给swap(int x,int y)中的x,y分别赋值。
我们来将其看得更明白一点,可以这样看
#include
{
int num1 = 10;
int num2 = 20;
printf("%d %d\n",num1,num2);
int x = num1;
int y = num2;
int m;
m = x;
x = num1;
y = num2;
printf("%d %d\n",num1,num2);
}
这样看就很容易看出端倪了,很明显你交换的是x,y的值,而xy又是另外的变量(你只是赋了num1,num2的值给xy而已),而你想要的结果是交换num1,num2的值,所以就行不同。
那么我们要怎么写才是对的呢?
其实这里的矛盾就在于在函数内部一顿操作却和外部的变量没有关系。
所以这个时候就要用到指针了!
我们再来回顾一下指针变量的基本含义:
int a = 10;
int* b = &a;(用指针变量搞到a的地址)
*b = 20;(解引用之后,*b就相当于a变量,这句话也可这样写a = 20;)
这就是指针变量的神奇之处,通过地址对变量进行改变。这里就会发现如果我将地址运用到上面函数,将函数内部和外部的变量联系起来(也就是我们上面讲的传址调用)是不是就不会出现这样子的尴尬了
#define _CRT_SECURE_NO_WARNINGS
#include
int swap(int* x,int* y)//运用指针变量获取外部变量的地址
{
int m = *x;//这里的*x就相当于num1
*x = *y;//这里的*x,*y就相当于num1,num2
*y = m;
}
int main()
{
int num1 = 10;
int num2 = 20;
printf("交换前的值分别是%d %d\n",num1,num2);
swap(&num1,&num2);//运用地址将外部变量信息传入内部,从而搭建好桥梁。
printf("交换后的值分别为%d %d\n",num1,num2);
return 0;
}
所以这样就完成了交换函数,上面就是运用外部变量的地址和指针变量,在函数内部对函数外部变量进行改写。