按引用传递还是按值传递?

52

当学习一门新的编程语言时,你可能会遇到一个问题,那就是这门语言默认是按值传递还是按引用传递。

因此,我的问题是,对于你们所熟悉的编程语言,它是如何实现的?有哪些可能的陷阱

你喜欢的编程语言可以是任何你曾经使用过的:流行的(如Ruby)、冷门的(如Obscure)、古怪的(如Brainfuck)、新颖的(如CUDA)、老旧的(如FORTRAN)等等...


这里已经有一个答案解释了PHP5中的情况。链接 - Mat
4
哇,这个问题有一个指向测试服务器的链接。我认为你需要修复这个链接。 - Andrew Grimm
为什么这个被关闭了? - The Daleks stand with Ukraine
11个回答

-1

默认情况下,ANSI/ISO C 使用以下两种方式之一——这取决于您如何声明函数及其参数。

如果您将函数参数声明为指针,则该函数将按引用传递,如果您将函数参数声明为非指针变量,则该函数将按值传递。

void swap(int *x, int *y);   //< Declared as pass-by-reference.
void swap(int x, int y);     //< Declared as pass-by-value (and probably doesn't do anything useful.)

如果您创建一个返回在函数内部创建的非静态变量指针的函数,可能会遇到问题。以下代码的返回值将是未定义的--无法知道分配给函数中临时变量的内存空间是否被覆盖或未被覆盖。
float *FtoC(float temp)
{
    float c;
    c = (temp-32)*9/5;
    return &c;
}

然而,您可以返回对静态变量的引用或传递在参数列表中的指针。

float *FtoC(float *temp)
{
    *temp = (*temp-32)*9/5;
    return temp;
}

6
这是错误的。C语言始终是按值传递。如果您声明参数为“int”,则将按值传递“int”;如果您声明参数为“float”,则将按值传递“float”;如果您声明参数为指针,则将按值传递指针,但永远不会有按引用传递。 - Jörg W Mittag
@JörgWMittag:在ANSI/ISO C中,指针是引用。 - oosterwal
完全错误。两个交换函数中的参数都是值。区别在于类型。第一个签名定义了两个指向int的指针参数,而第二个定义了两个int类型的参数。 - Aluan Haddad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接