在 C 中,通过引用传递意味着通过指向对象的指针间接传递对象。如果将对象直接传递给函数,则该函数将处理该对象值的副本。
比较此演示程序中的两个函数调用。
#include <stdio.h>
void f( int x )
{
x = 10;
}
void g( int *x )
{
*x = 10;
}
int main(void)
{
int x = 0;
printf( "Before call f: x = %d\n", x );
f( x );
printf( "After call f: x = %d\n", x );
putchar( '\n' );
printf( "Before call g: x = %d\n", x );
g( &x );
printf( "After call g: x = %d\n", x );
return 0;
}
程序输出是
Before call f: x = 0
After call f: x = 0
Before call g: x = 0
After call g: x = 10
那就是我们传递给函数f
物体x
直接地。所以该函数处理对象的副本x
。更改副本不会影响原始对象x
在 main 中声明。
至于功能g
然后它就可以访问该对象x
间接通过指向它的指针。所以改变指向的对象我们改变了对象x
在 main 中声明。
对于数组,当数组传递给函数时,它会隐式转换为指向其第一个元素的指针。所以该函数实际上是通过 this 指针通过引用获取数组的元素。使用指针和指针算术,我们可以更改数组的任何元素。
这个函数声明
void set_array(int array[4]);
等价于下面的声明
void set_array(int array[]);
并且两个声明都由编译器调整为声明
void set_array(int *array);
因此该函数处理一个指针——指向用作函数调用参数的数组第一个元素的指针。
程序中函数set_array的调用
set_array(b);
相当于下面的调用
set_array( &b[0] );
因为在表达式中使用的数组(例如作为函数参数表达式)会隐式转换为指向其第一个元素的指针。