按值和引用传递指针之间的区别?

Bri*_*ian 4 c++ pointers function pass-by-reference pass-by-value

我目前正在学习数据结构和算法课程,我的教授给了我们材料,其中包括接收指针值指针/引用值的函数

这些函数看起来像这样:

int function1(int a); // Pass by value
int function2(int &ref); // Pass by reference

int function3(int* ptr); // This will take in a pointer value
int function4(int*& ptr); // This will take in a pointer/reference value
Run Code Online (Sandbox Code Playgroud)

我了解按值传递按引用传递之间的区别。我也尝试将后两个示例都实现为基本函数,但我不完全确定这两个参数与引用传递有何不同,或者它们之间有何不同。

有人可以解释这两个函数参数是如何工作的以及它们如何实际使用吗?

JeJ*_*eJo 7

[...] 但我不完全确定这两个参数与引用传递有何不同或它们彼此有何不同。

在第一个函数中

int function3(int* ptr);
//            ^^^^ 
Run Code Online (Sandbox Code Playgroud)

你将指针int传递给一个by value。意义int*价值的。

在第二个,

int function4(int*& ptr);
//               ^^ --> here
Run Code Online (Sandbox Code Playgroud)

您将指针int传递by reference。这意味着您正在传递对该int*类型的引用。


但是,按值和按引用传递指针与按值或按引用传递常规变量类型(例如整数)在用法上有何不同?

相同的。当您按值传递指针时,您对传递的指针所做的更改(例如:分配另一个指针)将仅在函数 scop 中有效。另一方面,指针按引用传递的情况下,您可以直接对main(). 例如,请参见以下演示。

#include <iostream>    
// some integer
int valueGlobal{ 200 };

void ptrByValue(int* ptrInt)
{
    std::cout << "ptrByValue()\n";
    ptrInt = &valueGlobal;
    std::cout << "Inside function pointee: " << *ptrInt << "\n";
}

void ptrByRef(int *& ptrInt)
{
    std::cout << "ptrByRef()\n";
    ptrInt = &valueGlobal;
    std::cout << "Inside function pointee: " << *ptrInt << "\n";
}

int main()
{
    {
        std::cout << "Pointer pass by value\n";
        int value{ 1 };
        int* ptrInt{ &value };
        std::cout << "In main() pointee before function call: " << *ptrInt << "\n";
        ptrByValue(ptrInt);
        std::cout << "In main()  pointee after function call: " << *ptrInt << "\n\n";
    }
    {
        std::cout << "Pointer pass by reference\n";
        int value{ 1 };
        int* ptrInt{ &value };
        std::cout << "In main() pointee before function call: " << *ptrInt << "\n";
        ptrByRef(ptrInt);
        std::cout << "In main()  pointee after function call: " << *ptrInt << "\n\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

输出

Pointer pass by value
In main() pointee before function call: 1
ptrByValue()
Inside function pointee: 200
In main()  pointee after function call: 1

Pointer pass by reference
In main() pointee before function call: 1
ptrByRef()
Inside function pointee: 200
In main()  pointee after function call: 200
Run Code Online (Sandbox Code Playgroud)