为什么交换函数老是出错,是不是没有搞明白传值调用与传址调用

实参与形参:实参一般理解为定义函数外部定义的变量,而形参一般指定义函数内部的变量

一.传值调用

函数的形参和实参分别占有不同的内存块,对形参的改变不会影响实参。

二.传址调用

传址调用是把外部变量的地址传给函数的方式。

这种方式可以让函数和外边的变量真正建立起联系,也就是函数内部可以直接操作函数外部的变量。

区分它们的一个实例就是交换函数:

#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;

}

所以这样就完成了交换函数,上面就是运用外部变量的地址和指针变量,在函数内部对函数外部变量进行改写。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值