📜  通过引用进行C++调用:使用指针[包含示例]

📅  最后修改于: 2020-09-25 05:05:59             🧑  作者: Mango

在本教程中,我们将借助示例学习如何通过引用将指针作为函数的参数传递给C++调用。

在C++函数教程中,我们学习了有关将参数传递给函数。所使用的此方法称为“按值传递”,因为传递了实际值。

然而,参数传递到参数的实际值不会传递函数的另一种方式。而是传递对值的引用。

例如,

// function that takes value as parameter

void func1(int numVal) {
    // code
}

// function that takes reference as parameter
// notice the & before the parameter
void func2(int &numRef) {
    // code
}

int main() {
    int num = 5;

    // pass by value
    func1(num);

    // pass by reference
    func2(num);

    return 0;
}

注意& in void func2(int &numRef) 。这表示我们正在使用变量的地址作为参数。

因此,当我们通过传递变量num作为参数在main()调用func2() 函数时,实际上是在传递num变量的地址而不是值5

示例1:不带指针的引用传递

#include 
using namespace std;

// function definition to swap values
void swap(int &n1, int &n2) {
    int temp;
    temp = n1;
    n1 = n2;
    n2 = temp;
}

int main()
{

    // initialize variables
    int a = 1, b = 2;

    cout << "Before swapping" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    // call function to swap numbers
    swap(a, b);

    cout << "\nAfter swapping" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    return 0;
}

输出

Before swapping
a = 1
b = 2

After swapping
a = 2
b = 1

在此程序中,我们将变量ab传递给swap() 函数。注意函数定义,

void swap(int &n1, int &n2)

在这里,我们使用&表示该函数将接受地址作为其参数。

因此,编译器可以识别出变量的引用被传递给函数参数,而不是实际值。

swap() 函数, 函数参数n1n2分别指向与变量ab相同的值。因此,交换发生在实际价值上。

使用指针可以完成相同的任务。要了解指针,请访问C++指针。

示例2:使用指针传递引用

#include 
using namespace std;

// function prototype with pointer as parameters
void swap(int*, int*);

int main()
{

    // initialize variables
    int a = 1, b = 2;

    cout << "Before swapping" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    // call function by passing variable addresses
    swap(&a, &b);

    cout << "\nAfter swapping" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    return 0;
}

// function definition to swap numbers
void swap(int* n1, int* n2) {
    int temp;
    temp = *n1;
    *n1 = *n2;
    *n2 = temp;
}

输出

Before swapping
a = 1
b = 2

After swapping
a = 2
b = 1

在这里,我们可以看到输出与前面的示例相同。注意这一行,

// &a is address of a
// &b is address of b
swap(&a, &b);

在此,变量的地址是在函数调用期间传递的,而不是在变量传递时传递的。

由于传递的是地址而不是值,因此必须使用解引用运算符 *来访问存储在该地址中的值。

temp = *n1;
*n1 = *n2;
*n2 = temp;

*n1*n2给出存储在地址n1n2的值。

由于n1n2包含ab的地址,因此对*n1*n2做任何事情都会改变ab的实际值。

因此,当我们在main() 函数打印ab的值时,这些值会更改。