在 C 中不能通过引用传递,但可以使用指针作为替代
是的,没错。
详细说明一下。无论您将什么作为参数传递给 c 函数,它都仅通过值传递。无论是变量的值还是变量的地址。
区别在于您发送的内容。
当我们按值传递时,我们将变量的值传递给函数。当我们按引用传递时,我们将变量的别名传递给函数。 C 可以将指针传递给函数,但这仍然是按值传递。它将指针的值(地址)复制到函数中。
作为一个例子,我们可以看一些 C++ 代码来理解按值调用和按引用调用之间的真正区别。取自this http://programmingknowledgeblog.blogspot.in/2013/04/c-example-for-pass-by-reference.html网站。
// Program to sort two numbers using call by reference.
// Smallest number is output first.
#include <iostream>
using namespace std;
// Function prototype for call by reference
void swap(float &x, float &y);
int main()
{
float a, b;
cout << "Enter 2 numbers: " << endl;
cin >> a >> b;
if(a>b)
swap(a,b); // This looks just like a call-by-value, but in fact
// it's a call by reference (because of the "&" in the
// function prototype
// Variable a contains value of smallest number
cout << "Sorted numbers: ";
cout << a << " " << b << endl;
return 0;
}
// A function definition for call by reference
// The variables x and y will have their values changed.
void swap(float &x, float &y)
// Swaps x and y data of calling function
{
float temp;
temp = x;
x = y;
y = temp;
}
在这个 C++ 示例中,参考变量(C 中不存在)正在被使用。去引用this http://www.ntu.edu.sg/home/ehchua/programming/cpp/cp4_PointerReference.html网站,
“引用是别名,或者现有变量的替代名称......”,
and
“引用的主要用途是充当函数形式参数来支持引用传递......”
这与使用指针作为函数参数不同,因为,
“指针变量(或简称指针)与其他变量基本相同,都可以存储一段数据。与普通变量存储值(如 int、double、char)不同,指针存储的是值。一个内存地址。”
因此,本质上,当发送地址并通过指针接收时,仅发送值,但当发送/接收引用变量时,则发送别名或引用。
**UPDATE : 11 November, 2015**
业内曾有过长期争论C 聊天室 https://chat.stackoverflow.com/rooms/54304/c,在阅读了这个问题的评论和答案后,我意识到可以用另一种方式来看待这个问题,即另一种观点。
让我们看一些简单的 C 代码
int i;
int *p = &i;
*p = 123;
在这种情况下,人们可以使用这样的术语:p 的值是对 i 的引用。所以,如果是这种情况,那么如果我们发送相同的指针(int* p
)对于一个函数,人们可以说,因为i
的引用被发送到该函数,因此可以调用它引用传递.
因此,这是术语和看待场景的方式问题。
我不会完全不同意这个论点。但对于一个完全遵守书本和规则的人来说,这是错误的。
NOTE:更新灵感来自this https://chat.stackoverflow.com/transcript/message/26783261#26783261 chat.