如果我有一个函数需要一个指向整数的指针,并且我从我的 main 传递一个对整数变量的引用,那么这个调用是按值调用还是按引用调用?示例代码:
#include <iostream>
using namespace std;
void fun(int *a){
//Code block
}
int main(){
int a = 5;
fun(&a);
return 0;
}
在上面的代码中,函数fun的调用是值调用还是引用调用?
如果我有一个函数需要一个指向整数的指针,并且我从我的 main 传递一个对整数变量的引用,那么这个调用是按值调用还是按引用调用?示例代码:
#include <iostream>
using namespace std;
void fun(int *a){
//Code block
}
int main(){
int a = 5;
fun(&a);
return 0;
}
在上面的代码中,函数fun的调用是值调用还是引用调用?
您的调用是按值传递,但类型int*
不是参数类型int
。这意味着制作指针的副本并将其传递给函数。您可以更改它指向的值,但不能更改指针的值。
所以如果你的功能是这样的
void fun(int *a)
{
*a = 10;
}
你main
像这样打电话
int main() {
int b = 1;
fun(&b);
// now b = 10;
return 0;
}
您可以b
通过将指向它的指针传递给您的函数来修改值。
如果您执行以下操作会产生相同的效果 - 通过引用传递
void fun2(int& a)
{
a = 5;
}
int main()
{
int b = 10;
fun2(b);
// now b = 5;
return 0;
}
现在考虑第三个函数,它按值接受整数参数
void fun3(int a)
{
a = 10;
}
int main()
{
int b = 1;
fun3(b);
// b is still 1 now!
return 0;
}
使用按值传递,fun3
更改传递给它的参数的副本,而不是b
main 范围内的变量。
通过(非常量)引用或指针传递允许修改传递给它的参数。通过值或 const 引用传递将不允许更改传递给它的参数。
您正在按值传递a 所在的地址。
因此,当您在名为 fun 的 void 中键入 *a 时,您正在访问 a 的值。
但正如我所说,您通过值传递一个指向 a 的 int 指针。
您正在按值传递指向的指针a
。
根据您所说的抽象级别,您可以说您因此是a
通过指针传递,或者通过a
“句柄”传递。从更广泛的意义上讲,“通过a
引用传递”并不是严格不正确的,但在 C++ 中它是不正确的,因为“引用”在 C++ 中意味着特定的东西。此代码中没有 C++ 引用。
It is call by reference as you are passing reference the address reference to your variable so,
inside function
*a = 100;
changes the value of a in caller function as the content at that address has been changed.
But address is passed by value so
a = NULL;
will not change a, as a still be pointing to same address.