知道函数内的值是复制一份得到的(关键词-#include)

为什么还是没交换,能解释下原理吗,知道函数内的值是复制一份得到的,但还是不理解。

#include <stdio.h>
void swap(int a,int b);
int main()
{
    int a=5;
    int b=6;

    swap(a,b);
    printf("%d-%d\n",a,b);
    
    
        
    
    return 0;
}

void swap(int a,int b)
{
    int t;
    t=a;
    a=b;
    b=t;
    
}

在这个代码中,你试图在swap函数中交换ab的值。然而,当你调用swap(a,b)时,实际上是将ab的值复制到了swap函数的形参ab中,而不是直接对ab进行交换。

在C语言中,函数的参数传递方式是按值传递,这意味着函数接收的是实参的副本,而不是实参本身。因此,当你在swap函数中修改ab的值时,只是修改了函数内部的副本,而不会影响到主函数中的ab

要实现交换效果,可以使用指针作为参数,通过操作指针指向的地址来实现对变量的修改。下面是修改后的示例代码:

#include <stdio.h>
void swap(int *a, int *b);
int main()
{
    int a = 5;
    int b = 6;
 
    swap(&a, &b);
    printf("%d-%d\n", a, b);
    
    return 0;
}
 
void swap(int *a, int *b)
{
    int t;
    t = *a;
    *a = *b;
    *b = t;
}

在修改后的代码中,swap函数接收的是指向ab的指针,通过对指针进行解引用操作*,可以获取指针指向地址的值,并对其进行修改,从而达到交换变量的效果。在主函数中调用swap(&a, &b)时,将ab的地址作为实参传递给了swap函数。

通过这种方式,就可以在函数中修改变量的值,并且这个修改会影响到主函数中的变量。

希望这个解释可以帮助你理解为什么在你的代码中交换没有生效,并且给出了一个正确交换变量值的示例代码。如果你还有其他疑问,请随时提问。

因为函数内的a和b,与main里的a和b虽然变量名一样,但实际分配的内存空间不同。所以你交换函数内a和b变量的值,和main里的a和b变量一毛钱关系也没有
打个比方,你对某个人进行了克隆,产生了一个新的人,那么当新的人中奖1000万时,跟原来那个人是毫无关系的,因为是两个不同的人,虽然是克隆技术产生的
=========
如果参数改成指针类型,那么实际上相当于传递了一个身份证,这个身份证是唯一的,所以两个函数中的变量实际是同一个人

void 函数里是不能传参数的,你把里面参数删掉,把main里的也删掉

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7543424
  • 这篇博客你也可以参考下:用#include的文件中的内容给变量赋值
  • 除此之外, 这篇博客: 预处理指令中的 即#include预处理指令的作用是在指令处展开被包含的文件。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件
    • 标准C编译器至少支持八重嵌套包含。
    • 预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含,所以我们可以在多次包含同一个头文件时,通过给定预处理时的条件来达到不同的效果。
    • include 除了可以包含头文件,还可以包.c文件,但为了避免重复定义,最好不要包.c
  • 以下回答由chatgpt基于相关博客总结生成:

    在函数内部交换变量的值时,可能会遇到交换没有生效的情况。这是因为函数参数的传递方式会影响到变量值的操作。

    函数参数的传递方式通常有值传递和引用传递两种方式。在值传递方式下,函数会将参数的值复制一份传递给函数内部,而不是传递参数本身的引用。因此,对参数值的修改不会影响到原始变量。

    举例说明:

    void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    }
    
    int main() {
        int x = 1;
        int y = 2;
        swap(x, y);
        printf("x = %d, y = %d", x, y);
        return 0;
    }
    

    输出结果为 "x = 1, y = 2",说明在函数内部交换操作没有生效。

    为了解决这个问题,可以使用引用传递的方式将参数的引用传递给函数。引用传递可以修改参数的值,并且可以在函数内部对传入的变量进行修改。

    举例说明:

    void swap(int *a, int *b) {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    
    int main() {
        int x = 1;
        int y = 2;
        swap(&x, &y);
        printf("x = %d, y = %d", x, y);
        return 0;
    }
    

    输出结果为 "x = 2, y = 1",说明在函数内部交换操作生效了。

    在这个例子中,我们使用了指针作为函数的参数,并将变量的地址传递给函数。在函数内部,通过指针可以修改变量的值,从而实现了交换操作。

    因此,在函数中交换两个变量的值时,需要根据参数的传递方式来选择合适的方式。如果需要修改原始变量的值,可以使用引用传递方式(指针或引用),如果不需要修改原始变量的值,可以使用值传递方式。

    如果你还有其他关于函数参数传递方式的疑问,可以继续提问。

swap函数里面用int*接受,在调用的时候应该传&a,&b

主函数里定义的 int a , b; ,它的作用域就在主函数体内部,主函数结束后,它的生命期也随之结束。
void swap(int a,int b) 函数里的形参 int a, b; 及 int t;,它们的作用域在swap()函数体内,虽然与主函数里的变量同名,但互不干涉,是代表不同的变量,所以在函数里交换 a b 的值,作用仅局限在swap()函数体里, 待swap()函数运行结束,它们生命期也随之结束,对主函数里的变量不会有作用。