I heard that in "c" that there are we can pass the arguments via "call by value" or "call by reference". But in one book it's mentioned that there are we can pass the arguments via both way but there is no "pass by reference" but I actually pass the mostly arguments by "pass by reference".
So why it is mentioned "does C even have "pass by reference"?
A detailed description will be greatly appreciated.
Dav*_*nan 20
C参数始终按值而不是按引用传递.但是,如果您将对象的地址视为对该对象的引用,则可以按值传递该引用.例如:
void foo(int *x)
{
*x = 666;
}
Run Code Online (Sandbox Code Playgroud)
你在评论中提问:
那么,当我们可以按值传递所有参数时,为什么我们需要C中的指针?
因为在一种只支持按值传递的语言中,缺少指针会受到限制.这意味着你不能写这样的函数:
void swap(int *a, int *b)
{
int temp = *a;
*b = *a;
*a = temp;
}
Run Code Online (Sandbox Code Playgroud)
例如,在Java中,不可能编写该函数,因为它只有pass-by-value且没有指针.
在C++中,您可以使用以下引用编写函数:
void swap(int &a, int &b)
{
int temp = a;
b = a;
a = temp;
}
Run Code Online (Sandbox Code Playgroud)
同样在C#中:
void swap(ref int a, ref int b)
{
int temp = a;
b = a;
a = temp;
}
Run Code Online (Sandbox Code Playgroud)
Ker*_* SB 17
"引用语义"的概念是一个抽象的,理论上的概念,这意味着您可以通过为该函数提供对数据的引用来使函数修改现有数据.
问题是引用语义是否可以由语言实现.在C中,您可以使用指针获取引用语义.这意味着你可以获得所需的行为,但你需要自己组装各种各样的零碎(指针类型,地址运算符,解引用运算符,将指针作为函数参数传递("按值")).
相比之下,C++包含本机引用类型,因此直接在语言中实现引用语义.
其他语言有不同的方法到这一点,例如,在Python中的许多事情都是在默认情况下引用(和有区别,比如,与a = b和a = b[:]当b是一个列表).语言是否以及如何提供引用与值语义是语言设计的重要组成部分.