指针的应用(c语言)——(子函数实现交换父函数中变量的值)

本文详细解析了如何在C语言中通过子函数Swap正确交换两个整型变量的值,并提供了几种错误示例进行对比,同时介绍了如何通过指针正确修改父函数中的变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 子函数实现交换父函数中变量的值

int main()

{
int a=10;
int b=20;
Swap(a,b);//若实现a,b值交换,Swap()函数该怎么写?
printf("%d %d\n",a,b);
return 0;
}

子函数——被调用函数(Swap());父函数——调用函数(main());

这里是交换a,b 值的三种方法,你认为哪个正确呢?

void Swap1(int a,int b)

{
	int tmp= a;
	a=b;
	b=a;
}
void Swap2(int *p1,int *p2)
{
	int *tmp=p1;
	p1=p2;
	p2=tmp;
}
void Swap3(int *p1,int *p2)
{
	int *tmp; 
	*tmp = *p1;
	*p1 = *p2;
	*p2 = *tmp;
}

我们都运行一遍:

Swap1 ,Swap2运行结果都没用达到预期:   

Swap3运行中断  


这是为什么呢?接下来,我们来逐个分析:

Swap1(error):

void Swap_error1(int a,int b)//只是交换参数列表中的a,b的值
{
	int tmp= a;
	a=b;
	b=a;
}

Swap2(error):

void Swap_error2(int *p1,int *p2)//a,b值未发生交换,只是交换了p1,p2指针的指向
{
	int *tmp=p1;
	p1=p2;
	p2=tmp;
}

Swap3(error):

void Swap_error3(int *p1,int *p2)//指针运用错误
{
	int *tmp; //野指针,悬挂指针
	*tmp = *p1;//tmp为野指针,解引用会导致程序崩溃
	*p1 = *p2;
	*p2 = *tmp;
}    

怎么来写Swap()函数呢?

    要想改变父函数变量的值,就要在子函数中找到父函数的变量。而参数列表只是简单地拷贝实参,所以子函数得到的a,b是“假的,复制品”,只就是Swap1()没达到预期的原因。

   怎么找父函数的变量呢?当然要想到指针了,将父函数a,b的地址传递给参数列表,这样子函数就找到父函数的变量了。

void Swap(int *p1,int *p2)//得到a,b地址,交换a,b的值
{
	int tmp=* p1;
	*p1=*p2;
	*p2=tmp;
}

学会了吗?再来试一道题吧!

int main()

{
	int a = 10;
	int *p = &a;
	p = NULL;
	Fun(p);//怎么实现把p改为空指针?
	printf("%d\n",*p);
	return 0;
}

此处为什么会崩溃?怎么实现子函数“崩溃”?

“崩溃”:此时p=NULL;无法解引用;

子函数实现“p=NULL;”:

viod Fun(int* *p)
{
    *p=NULL;//修改父函数*p的
}
int main()
{
	int a = 10;
	int *p = &a;
	//p = NULL;
	Fun(&p);
	printf("%d\n",*p);
	return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值