我听说过" c"我们可以通过"通过值调用"来传递参数。或者"通过引用和#34;进行呼叫。 但在一本书中提到我们可以通过两种方式传递论据,但没有"通过引用传递"但我实际上通过"传递参考"。
传递了大部分参数那么为什么会被提及" C甚至有#34;通过引用传递"?
将非常感谢详细说明。
答案 0 :(得分:19)
C参数始终按值而不是按引用传递。但是,如果您将对象的地址视为该对象的引用,则可以按值传递该引用。例如:
void foo(int *x)
{
*x = 666;
}
你在评论中提问:
那么,当我们可以按值传递所有参数时,为什么我们需要C中的指针?
因为在一种只支持按值传递的语言中,缺少指针会受到限制。这意味着你不能写这样的函数:
void swap(int *a, int *b)
{
int temp = *a;
*b = *a;
*a = temp;
}
例如,在Java中,不可能编写该函数,因为它只有值传递且没有指针。
在C ++中,您可以使用以下引用编写函数:
void swap(int &a, int &b)
{
int temp = a;
b = a;
a = temp;
}
同样在C#中:
void swap(ref int a, ref int b)
{
int temp = a;
b = a;
a = temp;
}
答案 1 :(得分:17)
“引用语义”的概念是一个抽象的,理论上的概念,意味着您可以通过为该函数提供对数据的引用来使函数修改现有数据。
问题是语言是否可以实现引用语义。在C中,您可以使用指针获取引用语义。这意味着你可以获得所需的行为,但是你需要自己从各种各样的部分组装它们(指针类型,地址操作符,解引用操作符,将指针作为函数参数传递(“按值”))。
相比之下,C ++包含一个本机引用类型,因此直接在语言中实现引用语义。
其他语言有不同的方法,例如,在Python中,默认情况下很多东西都是引用(当a = b
是a = b[:]
时,b
和{{1}}之间存在差异。列表)。语言是否以及如何提供参考与价值语义是语言设计的重要组成部分。