Sử dụng con trỏ, gọi tham chiếu c++

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về lệnh gọi C ++ bằng cách tham chiếu đến việc truyền con trỏ làm đối số cho hàm với sự trợ giúp của các ví dụ.

Trong hướng dẫn Hàm C ++ , chúng ta đã học về cách truyền các đối số cho một hàm. Phương thức này được sử dụng được gọi là truyền theo giá trị vì giá trị thực được truyền.

Tuy nhiên, có một cách khác để truyền đối số cho một hàm mà giá trị thực của đối số không được truyền. Thay vào đó, tham chiếu đến các giá trị được chuyển.

Ví dụ,

// 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;
}

Lưu ý &trong void func2(int &numRef). Điều này biểu thị rằng chúng tôi đang sử dụng địa chỉ của biến làm tham số của chúng tôi.

Vì vậy, khi chúng ta gọi func2()hàm main()bằng cách truyền biến num làm đối số, chúng ta thực sự đang truyền địa chỉ của biến num thay vì giá trị 5 .C ++ Truyền theo giá trị so với Truyền theo tham chiếu

Ví dụ 1: Truyền qua tham chiếu mà không có con trỏ

#include <iostream>
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;
}

Đầu ra

Before swapping
a = 1
b = 2

After swapping
a = 2
b = 1

Trong chương trình này, chúng ta đã chuyển các biến a và b vào swap()hàm. Lưu ý định nghĩa hàm,

void swap(int &n1, int &n2)

Ở đây, chúng tôi đang sử dụng &để biểu thị rằng hàm sẽ chấp nhận các địa chỉ làm tham số của nó.

Do đó, trình biên dịch có thể xác định rằng thay vì các giá trị thực, tham chiếu của các biến được chuyển cho các tham số hàm.

Trong swap()hàm, các tham số hàm n1 và n2 đang trỏ đến cùng giá trị với các biến a và b tương ứng. Do đó, việc hoán đổi diễn ra trên giá trị thực tế.

Nhiệm vụ tương tự có thể được thực hiện bằng cách sử dụng các con trỏ. Để tìm hiểu về con trỏ, hãy truy cập C ++ Pointers .

Ví dụ 2: Chuyển qua tham chiếu bằng cách sử dụng con trỏ

#include <iostream>
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;
}

Đầu ra

Before swapping
a = 1
b = 2

After swapping
a = 2
b = 1

Ở đây, chúng ta có thể thấy đầu ra giống như ví dụ trước. Lưu ý dòng,

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

Ở đây, địa chỉ của biến được chuyển trong quá trình gọi hàm chứ không phải là biến.

Vì địa chỉ được chuyển thay vì giá trị, một toán tử tham chiếu *phải được sử dụng để truy cập giá trị được lưu trữ trong địa chỉ đó.

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

*n1và *n2cho giá trị được lưu tại địa chỉ n1 và n2 tương ứng.

Vì n1 và n2 chứa địa chỉ của a và b , bất kỳ điều gì được thực hiện với *n1và * n2 sẽ thay đổi giá trị thực của a và b .

Do đó, khi chúng ta in các giá trị của a và b trong main()hàm, các giá trị sẽ bị thay đổi.









Gõ tìm kiếm nhanh...