一.学过函数前
#include<stdio.h>
int main()
{
int t;
int a,b;
scanf_s("%d%d",&a,&b);
t=a;
a=b;
b=t;
printf("%d %d",a,b);
}
二.学过函数后
#include<stdio.h>
void fx(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);
fx(&a,&b);
printf("%d %d",a,b);
}
三.经典错误分析
#include<stdio.h>
void fx(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}
int main()
{
int a,b;
scanf_s("%d%d",&a,&b);
fx(&a,&b);
printf("%d %d",a,b);
}
为什么交换不了?
1.首先我们必须理解变量的本质即使内存,定义变量其实就是在申请储存空间。就好比一栋大厦中的房子一般,每个房间就是一个储存单元。我们定义变量就好比买房子一般,获得了这个房子的使用权。
2.地址值就好比房间的门牌号,门牌号(地址值)代指得就是这个房间(储存空间),而一个房间内又住着人(变量值)。所以,我们可以发现,改变地址值就可以改变其中的变量值(门牌号不同,代指里面的人自然不会相同),而单纯的改变内存中的变量值却没有办法改变地址值(就好比一个房间只是换了一个人住,门牌号不会变),而每一个门牌号都和里面的住户有一个对应关系(使用权)。
3.在这个典型错误中,定义的函数内部只是在交换变量值
void fx(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}
而函数内部所定义的形参和局部变量是具有生命期的,当函数调用结束后。系统将自动释放其所占用的内存,也就意味着函数内部的啊a,b所占有的储存空间将被释放。那么a,b所对应的函数值自然也会消失,而main函数中a,b变量地址与其内部变量值之间的对应关系没有任何改变。自然无法完成交换。
然后来看看正确的函数
void fx(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
这个为什么就行了呢?
1.a,b为指针变量,其所获得的是main函数中a,b的地址值。在a,b前加*即返回a,b地址所对应的变量值,所以这个函数实际上就是在利用指针变量作为桥梁修改a,b地址所对应的变量值。本质上修改的是一个地址与变量值之间的对应关系。
2.函数调用结束后,函数中所定义的两个指针变量a,b虽然会消失,但main函数中a,b变量地址值所对应的函数值已经被修改,这个对应关系的改变是不会随着形参的消失而消失的。
再来看一遍错误的函数
void(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}
这次就不难理解错误原因了,想要利用函数修改变量值,必须从地址与函数值的对应关系上入手,修改这层对应关系,才能做到真正的修改变量值。而上面的函数之所以错,也正是因为他只是单纯的在修改变量值。想利用外在力量(函数)赶走房间里的住客(变量值)当然不可能如此轻易。所以,我们只有修改使用权(地址与变量值的对应关系),才能令房中(储存空间)易主(变量值改变)。
知错而后能改 本人不才,还望各位大佬们多多指教!