C语言笔记——函数指针(应该是这个意思)

今天看到了一道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;}就可以了,而这个两个数值的转换需要用到指针的引用?这个问题还待思考,评论区的大牛也可以帮我解释一下,谢谢咯!

上一篇:Docker的内存配额及其安全


下一篇:冬季实战营学习报告