今天看到了一道C语言的题目,题目要求使用函数的形式将两个给定的数字交换,比如a=10,b=20,那么通过这个函数执行过后可以使得a=20,b=10.
首先一开始我使用的源代码是:
#include <stdio.h>
void swap(int x,int y) //这里的void使用的原因是这个swap函数没有返回值。
{
int a;
a=x;
x=y;
y=a;
}
int main()
{
int a=10;
int b=20;
swap(a,b);
printf("a=%d b=%d \n",a,b);
}
发现输出的结果还是a=10,b=20.查资料发现这是因为a,b的地址与它们赋值的x,y的地址不一样,也就是a,b分别把它们的值赋给了x,y,然后调用的swap函数所起的作用仅仅限于x,y之间。a把10赋给了x,b把20赋给了y,然后值之间的交换仅仅发生在x和y之间,使得x=20,y=10.但它们运算的结果所存在的地址和a,b的地址不一样,所以a,b的值不存在改变。输出的结果还是a=10,b=20.所以要怎么做才能实现a,b两个值之间的转换呢?
查资料发现可以使用指针的方式实现。
先附上源代码:
#include <stdio.h>
void swap(int* x, int* y)
{
int a=0;
a = *x;
*x = *y;
*y = a;
}
int main()
{
int b = 20;
int c = 10;
printf("b=%d c=%d \n", b, c);
swap(&b, &c);
printf("b=%d c=%d\n", b, c);
}
这个看起来就高级多了,首先还是看main函数里面的函数体,赋值b=20,c=10.然后我使用的swap函数传送的b,c的值其实实质上是b和c的地址,因为是取地符号,接受地址的话我们需要用到指针去接受由swap传送的b和c的地址,所以得定义两个指针变量x,y,指针变量的定义需要用int*,整体来说就是int* x,int* y,值得注意的是int和*是连在一起的,而x和y是与int*有一个空格的距离的。确定好指针变量接收地址后再使用解引用符,即*加上我们定义的指针变量,即*x,*y,这个可以理解成b和c是两个人的,&b和&c是它们各自的地址,然后我通过*b,*c去找到这两个人,内容理解就是*x相当于b,*y相当于c,我改变*x就相当于改变了b,因为我的x存的是b的地址,通过解引用符*x,我就可以通过地址去找到这个值,而*x就相当于这个值,即b,所以我先把*x赋给a,然后再把*y即c的值赋给*x即b,最后将a即*x的值赋给*y即c,这样就通过*x,*y的两个值的赋予转换,改变了b和c的值。
这一节运用到的指针函数去通过地址的赋予,指针接收地址,解引用地址然后改变想要改变的值,内容有点复杂难理解,回去以后还需要多多思考。
结果:
b= 20 c=10
b= 10 c=20
问题:为什么有的函数可以不用到指针的引用,想求两个数的最大值,仅仅只需要int max(int x,int y){if (x>y) return x;else return y;}就可以了,而这个两个数值的转换需要用到指针的引用?这个问题还待思考,评论区的大牛也可以帮我解释一下,谢谢咯!