5分钟搞懂C语言的传值和传址

2022-05-30 15:19:51 浏览数 (2)

前段时间公司招人,一个刚毕业的大学生来应聘,其中有道面试题是这样的。

补全下面的函数使其交换x,y的值。

代码语言:javascript复制
#include "stdio.h"

//编写swap函数交换x,y的值。
void swap(int x, int y){

}

int main(){
    int x = 20;
    int y = 30;

    printf("调用swap函数前:nx=%dny=%dn", x, y);
    //调用swap函数

    printf("调用swap函数后:nx=%dny=%dn", x, y);

    return 0;
}

看到这道题后,这个大学生很快地就开始在答题纸上开始写了,他是这样写的:

代码语言:javascript复制
#include "stdio.h"

//编写swap函数交换x,y的值。
void swap(int x, int y){
    int temp;
    temp = x;
    x = y;
    y = temp;
}

int main(){
    int x = 20;
    int y = 30;

    printf("调用swap函数前:nx=%dny=%dn", x, y);
    //调用swap函数
    swap(x, y);

    printf("调用swap函数后:nx=%dny=%dn", x, y);

    return 0;
}

思考一下,你的答案和这个大学生相同吗?

好了,我们来看下程序的运行结果:

什么?不可能吧,我已经将他们交换了啊?

好了,不要再纠结了,冲哥带你一起分析一下这段代码,为了清楚的说明,我们在swap函数里也加一个输出函数,然后看看结果。

代码语言:javascript复制
//
// Created by Administrator on 2020/8/24.
//

#include "stdio.h"

//编写swap函数交换x,y的值。
void swap(int x, int y){
    int temp;
    temp = x;
    x = y;
    y = temp;
    printf("swap函数里的x,y交换后:nx=%dny=%dn", x, y);
}

int main(){
    int x = 20;
    int y = 30;

    printf("调用swap函数前:nx=%dny=%dn", x, y);
    //调用swap函数
    swap(x, y);

    printf("调用swap函数后:nx=%dny=%dn", x, y);

    return 0;
}

运行结果:

分析上面的运行结果发现,main()函数中调用swap()函数前后xy的值并没有改变,但是在swap()函数中交换前后xy的值的确交换成功了,而在main()函数中为什么没有成功地实现交换呢?为了方便说明,我们用图来展示参数是如何进行传值的。

从图中清楚地发现,在函数的调用过程中实现的是main()函数里参数xy的传值,即把main()函数里参数x和y的值传递给swap函数里xyswap()函数中的xy拥有自己的存储空间,所以接下来在swap()函数中进行的交换操作仅仅是对swap函数内部xy进行的,不会影响到main()函数中xy的值。

那么怎样才能交换main函数里的xy呢?

我们再来看下面这段代码:

代码语言:javascript复制
//
// Created by Administrator on 2020/8/24.
//

#include "stdio.h"

//编写swap函数交换x,y的值。
void swap(int *px, int *py){
    int temp;
    temp = *px;
    *px = *py;
    *py = temp;
    printf("swap函数里的*px,*py交换后:n*px=%dn*py=%dn", *px, *py);
}

int main(){
    int x = 20;
    int y = 30;

    printf("调用swap函数前:nx=%dny=%dn", x, y);
    //调用swap函数
    swap(&x, &y);

    printf("调用swap函数后:nx=%dny=%dn", x, y);

    return 0;
}

运行结果:

分析上面的运行结果发现,此时不仅在swap()函数中成功交换了*px*py,而且在main()函数中也成功实现了xy的交换。为了能够更加直观地说明交换的实现,我们用图来展示参数是如何进行传递的。

图中可以清楚地发现,在函数的调用过程中实现的是参数x和y的传址,即把xy存储单元的地址传递给pxpyswap()函数中的形参不再拥有自己的存储空间,它们分别指向xy的存储单元,所以接下来在swap()函数中对pxpy指向的存储单元进行交换的操作其实是对xy进行的。这也是在采用传址的时候修改形参也会影响实参的原因。

通过以上实例是不是就能很容易理解C语言的传值和传址。

0 人点赞