之前的函数详解1大家看懂了吗?
现在我出一道这样的题目:写一个函数,用于交换两个整形变量的值
这里我用代码来表示应该是非常轻松的
#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
int a = 5;
int b = 10;
printf("交换前a=%d,b=%d\n", a, b);
//交换两变量值的方法
int tmp;
tmp = a;
a = b;
b = tmp;
printf("交换后a=%d,b=%d", a, b);
return 0;
}
这样对于大家来说应该非常简单了,但是题目要求要写函数,所以我们应该创建一个函数所以应该这样写
#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int swap(int,int);
int main() {
int a = 5;
int b = 10;
printf("交换前a=%d,b=%d\n", a, b);
//交换两变量值的方法
swap(a,b);
printf("交换后a=%d,b=%d", a, b);
return 0;
}
int swap(int x, int y) {
int tmp;
tmp = x;
x = y;
y = tmp;
return 0;
}
但是这样写又出现问题了,大家看一下结果
但是,a和b并没有进行交换,这里我将一步步告诉大家,因为这个函数应该出了问题,所以我们用f10和f11进入函数内部观察两个变量的情况,不过这里我多设置了两个监视的变量,分别是&a和&b
这就相当于在计算机内存中开辟了两块空间,之前讲过初识指针(没看过的点击),这里涉及到一些关于指针的内容,a变量所占的空间名字为0x0065fe2c ,b变量所占空间的名字为0x0065fe20 那么我接着向下调试代码,按f11进入函数内部我再多加及格监视的变量
用心的同学可能已经观察到了,x和a,y和b这两对变量的地址却完全不一样,在这个swap函数中,你其实在内存中又开辟了两块新的空间,你不断地在swap这个函数中对x和y进行操作但是并没有改变a和b,这一点我再一步进行调试
a和b的值在本质上并没有进行任何改变,至此你再进行打印,自然a和b就没有进行值的交换,这一步,你突然发现,你的代码写错了。那么如何让main函数和swap函数在内外中如何产生关联呢?
用地址,一个变量在不同的函数中,一个变量他所在的内存空间是不会发生改变的,所以我们应该想到用指针。
#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int swap(int*,int*);
int main() {
int a = 5;
int b = 10;
int* pa = &a;
int* pb = &b;
printf("交换前a=%d,b=%d\n", a, b);
//交换两变量值的方法
swap(pa, pb);
printf("交换后a=%d,b=%d", a, b);
return 0;
}
int swap(int* pa, int* pb) {
int tmp;
tmp = *pa;
*pa = *pb;
*pb = tmp;
return 0;
}
代码就应该这样写。接下来我来解析一下,这里我创造了两个指针pa,pb分别指向a所在的地址和所在的地址。这里通过pa就能找到变量a,pb就能找到pb,所以(*pa)就是a(*pb)就是b,通过将ab地址中存放的值进行交换,这个函数才算真正的完成