c++ - 使用指针参数调用函数与引用参数

标签 c++ pointers reference function-calls

<分区>

我希望有人能向我解释为什么调用带有引用参数的函数而不是带有指针参数的函数,给出如下内容:

int Func1 ( int & a );
int Func1 ( int * a );

int main()
{
   int y = 1;
   int & x = y;
   int * z = & y;

   Func1(y); // Calls reference version
   Func1(&y); // Calls pointer version
   Func1(z); // Calls pointer version

   return 0;
}

int Func1 ( int & a )
{
    cout << "Reference param Func1 called" << endl;
    a = a + 1;

    return a + 1;
}

int Func1 ( int * a )
{
    cout << "Pointer param Func1 called" << endl;
    *a = *a + 1;

    return *a + 1;
}

我对如何决定为 Func1(&y) 调用调用 Func1 的指针参数版本而不是 Func1 的引用参数版本感到困惑。另外,为什么没有为 Func1(z) 调用选择 Func1 的引用参数版本?如果 z 包含一个地址,我不明白为什么不能将该地址传递到 Func1( &a ) 的引用参数中。

最佳答案

int Func1 ( int & a ); 匹配参数表达式类型为 int 的调用(并且有资格对其进行非常量引用)。 int Func1 ( int * a ); 匹配参数表达式类型为 int* 的调用。

If z holds an address, I don't see why the address can't be passed into the reference parameter for Func1( &a ).

好吧,您可以通过调用 Func1(*z) 来实现。

关于c++ - 使用指针参数调用函数与引用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20477790/

相关文章:

c++ - std::make_pair 与 c++ 11

c++ - 具有共享内存的 cuda 平铺 3d 卷积实现

c++ - Visual Studio .cu 文件显示语法错误但编译成功

C - 线程函数 : Casting a (void*) to a (long) and code works? 但是如何呢?

c++指针问题 - 通过方法更新指针

Java 转换对象

c - 通过引用将字符串数组传递给 C 函数 - 无效指针

java - 在 Java 中避免按引用传递的方法

c++ - 奇数 C++ 字符数组引用

c++ - 如果在保持相同类型的同时添加常量,static_cast 运行时开销是多少?