赞
踩
在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;
- }
调试结果如下:
希望上述能对一些小伙伴们的理解有帮助!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。