我知道C语言中没有按引用调用。
正确的。 C 总是按值传递。
有人说C中有一个Call by Reference,我很困惑。
他们错了。这很容易测试。
让我们首先看一下这个小型 Perl 程序。
use 5.014;
sub f {
$_[0] = 456; # $_[0] is the first argument.
}
my $x = 123;
f( $x );
say $x; # 456
改变参数改变了参数。这是按引用传递的示例。 Perl 参数通过引用传递。
现在让我们在 C 中做同样的事情。
#include <stdio.h>
void f( int x ) {
x = 456;
}
int main( void ) {
int x = 123;
f( x );
printf( "%d\n", x ); // 123
}
更改参数对参数没有影响。这是按值传递的示例。 C 的参数是按值传递的。
您可以使用指针来实现类似的结果。
#include <stdio.h>
void f( int *xp ) {
*xp = 456;
}
int main( void ) {
int x = 123;
f( &x );
printf( "%d\n", x ); // 456
}
请注意,参数(指针)仍然按值传递。改变xp
本身(而不是*xp
) 对调用者没有影响。
数组也是如此。退化为按值传递的指针。
#include <stdio.h>
void f( char a[] ) {
a = "def";
}
int main( void ) {
char a[] = "abc";
f( a );
printf( "%s\n", a ); // abc
}
这可以称为传递a参考。它没有通过by不过参考一下。
但是,在 C++ 中,“通过引用调用”是可能的
Correct.
C++ 通常使用按值传递。
#include <iostream>
using namespace std;
void f( int x ) {
x = 456;
}
int main( void ) {
int x = 123;
f( x );
cout << x << endl; // 123
}
但可以使用以下方式请求通过引用传递&
.
#include <iostream>
using namespace std;
void f( int &x ) {
x = 456;
}
int main( void ) {
int x = 123;
f( x );
cout << x << endl; // 456
}