两个数字的交换(指针的使用)

  最近刚刚学了号称C语言最难的指针, 初学之际如果未加以正确的解释和引导确实很难理解,其实所谓指针就是一个地址变量,在计算机中,在进行绝大多数操作是都应该先调用地址将所需要的值存放进去以供使用,而所谓指针,其实就是一个地址变量,它的意义是所指向的地址,只不过要注意,在定义指针变量时,要在前面附加数据类型,虽然其本质是一个地址变量,但还是指向地址中所存放的数据,根据这个原理,接下来我们做一个小测验探究一下指针究竟是如何使用的。

 

#include<stdio.h>

int Swap(int a,int b)

{
    int tmp;
    tmp = a;
    a = b;
    b = tmp;

printf("%d,%d\n",a,b);
return 0;

}

int main()
{
int a;
int b;
scanf("%d",&a);
scanf("%d",&b);
Swap(a,b);
printf("%d,%d\n",a,b);

return 0;
}

 

如上图代码,这是一条个简单的交换两个数的程序,但是运行过后,结果却是这样

  第三行的是在函数内部实现的交换,我们也看到确实完成了交换,但是在主函数中重新输出两个数,发现其值并没有发生改变,也就是说交换其实根本未完成。在子函数中,我们完成了两个数的交换,但实际上刚刚输入的a、b两个数并没有进行交换,运行到这里,就不得不提到自定义函数的性质,众所周知,函数有形参与实参两种参数,实参将值传递给形参然后供函数使用,一切的动作都也只会在函数内部进行,而在函数,作为把值传递给形参的实参并不会受到任何影响,所以若想修改形参的值,就要用到接下来提到的指针。

我们将程序作如下修改,引入指针:

值得注意的是,这里有两个容易犯的错误会导致程序崩溃

int Swap_error1(int *m,int *n)
{
	int *tmp; //这样做的结果为,只将a,b的地址进行了交换,而地址内所存放的值并没有发生任何变化
	tmp = n;
	n = m;
	m = tmp;

	return 0;
}
int Swap_error2(int *m,int *n)
{
	int *tmp;//野指针,悬挂指针
	*tmp = *n;//野指针的特点是没有访问权限
	*n = *m;//当使用此类型的指针时会因为没有访问权限而导致程序崩溃
	*m = *tmp;

	return 0;
}

上面两种错误是在一开始使用指针时因为概念模糊导致的错误,在这里列出来起到警醒作用,在使用指针时一定要时刻明确自己此时此刻是需要传递地址还是地址所指向的值,只有明确了这些·,才能做到正确的使用指针。

以下是正确的指针使用方法:

int Swap2(int *m,int *n)
{
	int tmp;
	tmp = *n;
	*n = *m;
	*m = tmp;

	return 0;
}

int main()
{
int a;
int b;
scanf("%d",&a);
scanf("%d",&b);
printf("%d,%d\n",a,b);
Swap2(&a,&b);
printf("%d,%d\n",a,b);

return 0;
}

 

此时,交换函数的两个形参已经变成了两个指针,前面提到指针就是地址,所以在调用该函数时,我们需要将两个对应的地址变量传进函数才不会引起编译错误,在这里我们将a,b的地址作为实参传进函数,就没有问题了。

我们也可以看到,交换两个数的值这个功能已经实现。

 在这里,我们要说一下这个函数成功的根本原因,就在于指针直接指向了a,b的地址,接下来的解引用所交换的就是地址中存放的值,所以说从根本上改变了a,b的值,自然也就能完成交换的过程。

注意:若需要子函数的改变能影响到父函数,一定要进行传指针和解引用,两个条件缺一不可。

 

  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值