在C语言中,有两种方法可以将数据传递给函数,分别是值传递(Call by value)和引用传递(Call by reference)。

callbyvalue-callbyreference-in-c.png

让我们逐一了解C语言中的值传递和引用传递。

值传递(Call by value)在C中

  • 在值传递方法中,实际参数的值被复制到形式参数中。换句话说,在值传递方法中,函数调用时使用的是变量的值。
  • 在值传递方法中,无法通过形式参数修改实际参数的值。
  • 在值传递中,实际参数和形式参数分别分配不同的内存,因为实际参数的值被复制到形式参数中。
  • 实际参数是函数调用时使用的参数,而形式参数是函数定义时使用的参数。

让我们通过以下示例来理解C语言中的值传递:

#include <stdio.h> 

void change(int num) {  
    printf("在函数内添加值之前,num=%d \n",num);  
    num = num + 100;  
    printf("在函数内添加值之后,num=%d \n", num);  
}  

int main() {  
    int x = 100;  
    printf("在函数调用之前,x=%d \n", x);  
    change(x); // 将值传递给函数  
    printf("在函数调用之后,x=%d \n", x);  
    return 0; 
}  

输出结果

Copy code
在函数调用之前,x=100
在函数内添加值之前,num=100
在函数内添加值之后,num=200
在函数调用之后,x=100

值传递示例:交换两个变量的值

#include <stdio.h> 

void swap(int a, int b) {  
    int temp;  
    temp = a; 
    a = b; 
    b = temp; 
    printf("在函数中交换值之后,a = %d, b = %d\n",a,b); // 形式参数, a = 20, b = 10  
} 

int main() { 
    int a = 10; 
    int b = 20;  
    printf("在main函数中交换值之前,a = %d, b = %d\n",a,b); // 在main函数中打印a和b的值 
    swap(a,b); 
    printf("在main函数中交换值之后,a = %d, b = %d\n",a,b); // 在值传递中,通过更改形式参数来改变实际参数的值是不起作用的,a = 10, b = 20 
    return 0; 
} 

输出结果

在main函数中交换值之前,a = 10, b = 20
在函数中交换值之后,a = 20, b = 10
在main函数中交换值之后,a = 10, b = 20  

引用传递(Call by reference)在C中

  • 在引用传递中,将变量的地址作为实际参数传递给函数调用。
  • 通过更改形式参数,可以修改实际参数的值,因为传递了实际参数的地址。
  • 在引用传递中,形式参数和实际参数的内存分配是相同的。函数中的所有操作都是在实际参数的地址存储的值上执行的,并且修改后的值存储在相同的地址上。

考虑以下关于引用传递的示例:

#include <stdio.h> 

void change(int *num) {  
    printf("在函数内添加值之前,num=%d \n",*num);  
    (*num) += 100;  
    printf("在函数内添加值之后,num=%d \n", *num);  
}   

int main() {  
    int x = 100;  
    printf("在函数调用之前,x=%d \n", x);  
    change(&x); // 将引用传递给函数  
    printf("在函数调用之后,x=%d \n", x);  
    return 0; 
}

输出结果

在函数调用之前,x=100
在函数内添加值之前,num=100
在函数内添加值之后,num=200
在函数调用之后,x=200

引用传递示例:交换两个变量的值

#include <stdio.h> 

void swap(int *a, int *b) {  
    int temp;  
    temp = *a; 
    *a = *b; 
    *b = temp; 
    printf("在函数中交换值之后,a = %d, b = %d\n",*a,*b); // 形式参数, a = 20, b = 10  
} 

int main() { 
    int a = 10; 
    int b = 20;  
    printf("在main函数中交换值之前,a = %d, b = %d\n",a,b); // 在main函数中打印a和b的值 
    swap(&a,&b); 
    printf("在main函数中交换值之后,a = %d, b = %d\n",a,b); // 在引用传递中,实际参数的值会改变,a = 10, b = 20 
    return 0; 
} 

输出结果

在main函数中交换值之前,a = 10, b = 20
在函数中交换值之后,a = 20, b = 10
在main函数中交换值之后,a = 20, b = 10  

值传递和引用传递在C中的区别

No.值传递(Call by value)引用传递(Call by reference)
1将值的副本传递给函数将值的地址作为实际参数传递给函数
2在函数内部进行的更改仅限于函数内部。通过更改形式参数来改变实际参数的值是不起作用的。在函数内部进行的更改在函数外部也会生效。通过更改形式参数来改变实际参数的值。
3实际参数和形式参数在不同的内存位置分配实际参数和形式参数在相同的内存位置分配

标签: c语言, c语言教程, c语言技术, c语言学习, c语言学习教程, c语言下载, c语言开发, c语言入门教程, c语言进阶教程, c语言高级教程, c语言面试题, c语言笔试题, c语言编程思想