C语言函数详解2——函数传指针

之前的函数详解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地址中存放的值进行交换,这个函数才算真正的完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值