Bootstrap

15. 函数参数传递机制

1. 项目场景:

➢ 米粒对Jack Qiao说:“她在函数参数传递时,发现将一个变量传递给函数时,传递失败。”


2. 问题描述

➢ 举个栗子:用以下代码交换ab的值,结果失败:

 

#include<stdio.h>

void Swap(int x, int y)
{
    int temp = 0;
    temp = x;
    x = y;
    y = temp;
}

int main()
{
    int a = 0;
    int b = 0;
    scanf("%d %d", &a, &b);
    printf("交换之前的a=%d,b=%d\n", a, b);
    Swap(a, b); 
    printf("交换后的a=%d,b=%d\n", a, b);
    return 0;
}

 失败的结果如下


3. 原因分析:

 在米粒的原始代码中,Swap 函数的参数是按值传递的。这意味着当你调用 Swap(a, b) 时,x 和 实际上是 a 和 b 的副本。因此,米粒在 Swap 函数内部对 x 和 y 的修改不会影响到 main 函数中的 a b


4. 解决方案:

通过传递变量的地址可以在函数内部直接修改原始变量的值函数参数传递机制

#include<stdio.h>

void Swap(int* x, int* y)
{
    int temp = 0;
    temp = *x;
    *x = *y;
    *y = temp;
}

int main()
{
    int a = 0;
    int b = 0;
    scanf("%d %d", &a, &b);
    printf("交换之前的值:a=%d,b=%d\n", a, b);
    Swap(&a, &b);  // 传递变量的地址
    printf("交换之后的值:a=%d,b=%d\n", a, b);
    return 0;
}

 成功运行结果如下:

★ 总结

     ☞ 指针传递Swap 函数的参数是 int *x 和 int *y,表示它们是指向整数的指针。

     ☞ 修改原始变量:通过 *x 和 *y 访问并修改指针所指向的变量。

     ☞ 传递地址:在 main 函数中,通过 &a 和 &b 传递变量的地址。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;