C语言中带指针和不带指针交换变量值

在C语言中,我们经常遇到交换两个数值的情况,一般会选择通过指针交换两个数值的地址而真正交换两个数。有些小伙伴不太明白两者之间的区别,这里就详细地说明一下。

经典的错误:

#include<stdio.h>
void swap(int x, int y);
int main()
{
	int a = 100;
	int b = 200;
	printf("交换前的a=%d,b=%d", a, b);
	swap(a, b);
	printf("\n交换后的a=%d,b=%d", a, b);
	return 0;
}
void swap(int x, int y)
{
	int temp = x;
	x = y;
	y = temp;
}

        刚开始接触函数和指针的时候我是真不懂为什么两个数的值没有交换,即便我将a,b设置为全局变量,依旧无法使两个数值直接交换。

        后来才了解到,上述代码中的两数值交换,在调用的函数swap中,a和b的数值的确交换了,但是一跳出swap函数后,一切皆为虚无,a仍是a,b仍是b。相当于a和b做了个“swap”的梦,梦里两人互换身份。梦醒后,a仍是a,b仍是b,所有的交换都是浮云。

        而为什么通过指针修改地址,就能实现两个数值的改变呢?因为当指针指向某一个已赋值的变量后,该指针所保存的地址的内存空间中存放的就是变量所赋值的数值的二进制形式,也就是说指针跟数值是捆绑在一起的,当你改变了地址后,变量还是原来的那个变量,数值已经随着指针的交换而交换了。

        具体如下所示:

指针控制交换两数值

       首先先明白,变量地址和变量的值的关系。

        变量以它所占据的那块内存的第一个字节的地址(即起始地址)来表示该变量在内存中的地址。每个变量有唯一的地址,便是在内存中的位置,如下图所示,整型变量x占用从0028FF1C~0028FF1F四个字节的内存空间,变量x的地址就是0028FF1C。

        其次,每个变量的值存储在变量地址表示的那段内存空间中。例如变量x的值10就以二进制的形式存放在编译器为x分配的四个空间中。通过变量名可以直接访问变量的值。

变量存储示意图

 

        而指针变量就是用于保存地址的变量。 指针的定义如下:

int a=100;
int *z=&a;

        以上两条语句的含义:a是一个整型变量,赋值为100;z是一个指针变量,其指向的是a的地址,该地址所表示的内存空间中存放的是值100的二进制形式。当地址交换后,地址中所表示的内存空间中的内容也将一起交换。

        当我们设置给两个整型变量赋值,并设置两个指针变量分别指向这两个整型变量:

int a=100,b=200;
int *z=&a;
int *y=&b;

        在main函数中调用a,b的地址:

swap(&a,&b);   //&a和&b是实际参数,传递的是a,b的地址

        当在swap函数中进行交换时,参数就得是a,b的地址: 

void swap(int* M, int* N)    //M,N 是形式参数,M代表的是a的地址,N代表b的地址
{
    int temp=*M;            //*M表示通过M间接访问得到M的值,即a的值
    *M=*N;
    *N=temp;
}    

 完整代码如下:

#include<stdio.h>
void swap(int* M, int* N);
int main()
{
	int a = 100;
	int b = 200;
	int* z = &a;
	int* y = &b;
	printf("交换前的a=%d,b=%d", a, b);
	swap(&a, &b);
	printf("\n交换后的a=%d,b=%d", a, b);
	return 0;
}
void swap(int* M, int* N)
{
	int temp = *M;
	*M = *N;
	*N= temp;
}

 调试结果如下:

希望上述能对一些小伙伴们的理解有帮助! 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值