Con trỏ và Mảng C++

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về mối quan hệ giữa mảng và con trỏ với sự trợ giúp của các ví dụ.

Trong C ++, Con trỏ là các biến giữ địa chỉ của các biến khác. Một con trỏ không chỉ có thể lưu trữ địa chỉ của một biến đơn lẻ, nó còn có thể lưu trữ địa chỉ của các ô trong một mảng .

Hãy xem xét ví dụ này:

int *ptr;
int arr[5];

// store the address of the first
// element of arr in ptr
ptr = arr;

Ở đây, ptr là một biến con trỏ trong khi arr là một intmảng. Đoạn mã ptr = arr;lưu trữ địa chỉ của phần tử đầu tiên của mảng trong biến ptr .

Chú ý rằng chúng tôi đã sử dụng arrthay vì &arr[0]. Điều này là do cả hai đều giống nhau. Vì vậy, mã bên dưới giống như mã trên.

int *ptr;
int arr[5];
ptr = &arr[0];

Các địa chỉ cho phần còn lại của các phần tử mảng được đưa ra bởi &arr[1]&arr[2]&arr[3], và &arr[4].

Trỏ đến mọi phần tử mảng

Giả sử chúng ta cần trỏ đến phần tử thứ tư của mảng bằng cách sử dụng cùng một con trỏ ptr .

Ở đây, nếu ptr trỏ đến phần tử đầu tiên trong ví dụ trên thì ptr + 3sẽ trỏ đến phần tử thứ tư. Ví dụ,

int *ptr;
int arr[5];
ptr = arr;

ptr + 1 is equivalent to &arr[1];
ptr + 2 is equivalent to &arr[2];
ptr + 3 is equivalent to &arr[3];
ptr + 4 is equivalent to &arr[4];

Tương tự, chúng ta có thể truy cập các phần tử bằng con trỏ đơn. Ví dụ,

// use dereference operator
*ptr == arr[0];
*(ptr + 1) is equivalent to arr[1];
*(ptr + 2) is equivalent to arr[2];
*(ptr + 3) is equivalent to arr[3];
*(ptr + 4) is equivalent to arr[4];

Giả sử nếu chúng ta đã khởi tạo ptr = &arr[2];thì

ptr - 2 is equivalent to &arr[0];
ptr - 1 is equivalent to &arr[1]; 
ptr + 1 is equivalent to &arr[3];
ptr + 2 is equivalent to &arr[4];

Làm việc của con trỏ C ++ với mảng

Lưu ý: Địa chỉ giữa ptr và ptr + 1 khác nhau 4 byte. Đó là bởi vì ptr là một con trỏ đến một intdữ liệu. Và, kích thước của int là 4 byte trong hệ điều hành 64 bit.

Tương tự, nếu con trỏ ptr đang trỏ đến charkiểu dữ liệu, thì địa chỉ giữa ptr và ptr + 1 là 1 byte. Đó là vì kích thước của một ký tự là 1 byte.

Ví dụ 1: Con trỏ và Mảng C++

// C++ Program to display address of each element of an array 

#include <iostream>
using namespace std;

int main()
{
    float arr[3];

    // declare pointer variable
    float *ptr;
    
    cout << "Displaying address using arrays: " << endl;

    // use for loop to print addresses of all array elements
    for (int i = 0; i < 3; ++i)
    {
        cout << "&arr[" << i << "] = " << &arr[i] << endl;
    }

    // ptr = &arr[0]
    ptr = arr;

    cout<<"\nDisplaying address using pointers: "<< endl;

    // use for loop to print addresses of all array elements
    // using pointer notation
    for (int i = 0; i < 3; ++i)
    {
        cout << "ptr + " << i << " = "<< ptr + i << endl;
    }

    return 0;
}

Đầu ra

Displaying address using arrays: 
&arr[0] = 0x61fef0
&arr[1] = 0x61fef4
&arr[2] = 0x61fef8

Displaying address using pointers: 
ptr + 0 = 0x61fef0
ptr + 1 = 0x61fef4
ptr + 2 = 0x61fef8

Trong chương trình trên, đầu tiên chúng ta chỉ cần in địa chỉ của các phần tử mảng mà không cần sử dụng biến con trỏ ptr .

Sau đó, chúng tôi sử dụng con trỏ ptr để trỏ đến địa chỉ của [0] , ptr + 1để trỏ đến địa chỉ của [1] , v.v.

Trong hầu hết các ngữ cảnh, tên mảng phân rã thành con trỏ. Nói cách đơn giản, tên mảng được chuyển đổi thành con trỏ. Đó là lý do tại sao chúng ta có thể sử dụng con trỏ để truy cập các phần tử của mảng.

Tuy nhiên, chúng ta nên nhớ rằng con trỏ và mảng không giống nhau.

Có một số trường hợp tên mảng không phân rã thành con trỏ. Để tìm hiểu thêm, hãy truy cập: Khi nào tên mảng không bị phân rã thành con trỏ?

Ví dụ 2: Tên mảng được sử dụng làm con trỏ

// C++ Program to insert and display data entered by using pointer notation.

#include <iostream>
using namespace std;

int main() {
    float arr[5];
    
   // Insert data using pointer notation
    cout << "Enter 5 numbers: ";
    for (int i = 0; i < 5; ++i) {

        // store input number in arr[i]
        cin >> *(arr + i) ;

    }

    // Display data using pointer notation
    cout << "Displaying data: " << endl;
    for (int i = 0; i < 5; ++i) {

        // display value of arr[i]
        cout << *(arr + i) << endl ;

    }

    return 0;
}

Đầu ra

Enter 5 numbers: 2.5
3.5
4.5
5
2
Displaying data: 
2.5
3.5
4.5
5
2

Đây,

  1. Đầu tiên chúng tôi sử dụng ký hiệu con trỏ để lưu trữ các số do người dùng nhập vào mảng arr .cin >> *(arr + i) ;Mã này tương đương với mã dưới đây: cin >> arr[i];Lưu ý rằng chúng tôi đã không khai báo một biến con trỏ riêng biệt, mà là chúng tôi đang sử dụng tên mảng arr cho ký hiệu con trỏ.Như chúng ta đã biết, tên mảng arr trỏ đến phần tử đầu tiên của mảng. Vì vậy, chúng ta có thể coi arr hoạt động như một con trỏ.
  2. Tương tự, sau đó chúng tôi sử dụng forvòng lặp để hiển thị các giá trị của arr bằng cách sử dụng ký hiệu con trỏ.cout << *(arr + i) << endl ;Mã này tương đương vớicout << arr[i] << endl ;








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