Chi tiết bài học Con trỏ và mảng trong C++

Con trỏ và mảng trong C++

Trong bài này, bạn sẽ được học về mối quan hệ giữa mảng và con trỏ, và cách sử dụng chúng hiệu suất cao trong chương trình của bạn .

Con trỏ là các biến chứa địa chỉ. Con trỏ không những có thể chứa được địa chỉ của một biến duy nhất, nó còn có thể chứa được địa chỉ các ô nhớ của một mảng.

Xét ví dụ sau :

int* ptr;
int a[5];
ptr = &a[2];  // &a[2] là địa chỉ của phần tử thứ 3 trong a[5].

Giả sử, con trỏ cần trỏ tới thành phần thứ tư của một mảng, nghĩa là nó chứa địa chỉ của thành phần thứ tư của mảng trong trường hợp trên .
Vì ptr trỏ tới thành phần thứ ba trong trường hợp trên, ptr + 1 sẽ trỏ tới thành phần thứ 4 .
Bạn hoàn toàn có thể nghĩ ptr + 1 sẽ trả về địa chỉ của byte tiếp theo. Nhưng điều đó không đúng .
Vì con trỏ ptr là một con trỏ kiểu int và kích cỡ của int là cố định và thắt chặt trên một hệ quản lý và điều hành ( kích cỡ của int là 4 bytes trên hệ quản lý 64 bits ). Vì thế địa chỉ giữa ptr và ptr + 1 sẽ lệnh nhau 4 bytes .
Nếu con trỏ ptr trỏ tới char, vậy địa chỉ giữa ptr và ptr + 1 sẽ lệch nhau 1 byte, vì kích cỡ của char là 1 byte .

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

Chương trình C++ giúp hiển thị địa chỉ của các phần tử trong một mảng sử dụng cả mảng và con trỏ.

#include 
using namespace std;

int main()
{
    float arr[5];
    float *ptr;
    
    cout << "Displaying address using arrays: " << endl;
    for (int i = 0; i < 5; ++i)
    {
        cout << "&arr[" << i << "] = " << &arr[i] << endl;
    }

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

    cout<<"\nDisplaying address using pointers: "<< endl;
    for (int i = 0; i < 5; ++i)
    {
        cout << "ptr + " << i << " = "<< ptr + i << endl;
    }

    return 0;
}

Đầu ra

Displaying address using arrays :
và arr [ 0 ] = 0x7 fff5fbff880
và arr [ 1 ] = 0x7 fff5fbff884
và arr [ 2 ] = 0x7 fff5fbff888
và arr [ 3 ] = 0x7 fff5fbff88c
và arr [ 4 ] = 0x7 fff5fbff890

Displaying address using pointers :
ptr + 0 = 0x7 fff5fbff880
ptr + 1 = 0x7 fff5fbff884
ptr + 2 = 0x7 fff5fbff888
ptr + 3 = 0x7 fff5fbff88c

ptr + 4 = 0x7 fff5fbff890

Trong chương trình trên, một con trỏ ptr khác được sử dụng để hiện thị địa chỉ của những thành phần trong mảng arr .
Nhưng những thành phần trong mảng hoàn toàn có thể được truy xuất bằng cách sử dụng ký hiệu con trỏ với cùng tên mảng arr. Ví dụ :

int arr[3];

&arr[0] tương đương với arr
&arr[1] tương đương với arr + 1
&arr[2] tương đương với arr + 2

Ví dụ 2: Con trỏ và mảng

Chương trình C++ giúp hiển thị địa chỉ các phần tử của mảng sử dụng ký hiệu con trỏ.

#include 
using namespace std;

int main() {
    float arr[5];
    
    cout<<"Displaying address using pointers notation: "<< endl;
    for (int i = 0; i < 5; ++i) {
        cout << arr + i <

Đầu ra

Displaying address using pointers notation :
0x7 fff5fbff8a0
0x7 fff5fbff8a4
0x7 fff5fbff8a8
0x7 fff5fbff8ac

0x7 fff5fbff8b0

Bạn biết rằng con trỏ ptr chứa địa chỉ và biểu thức * ptr trả về giá trị lưu tại địa chỉ đó .
Tương tự, bạn hoàn toàn có thể lấy giá trị lưu trong con trỏ ptr + 1 bằng cách sử dụng * ( ptr + 1 ) .

Xem đoạn mã dưới đây:

int ptr[5] = {3, 4, 5, 5, 3};
  • và ptr [ 0 ] tương đương với ptr và * ptr tương đương với ptr [ 0 ]

  • và ptr [ 1 ] tương đương với ptr + 1 và * ( ptr + 1 ) tương đương với ptr [ 1 ]

  • và ptr [ 2 ] tương đương với ptr + 2 và * ( ptr + 2 ) tương đương với ptr [ 2 ]

  • và ptr [ i ] tương đương với ptr + i và * ( ptr + i ) tương đương với ptr [ i ]

Ví dụ 3: Con trỏ và mảng trong C++

Chương trình C++ giúp chèn và hiển thị dữ liệu nhập vào sử dụng ký hiệu con trỏ.

#include 
using namespace std;

int main() {
    float arr[5];
    
   // Chèn vào dữ liệu sử dụng ký hiệu con trỏ
    cout << "Enter 5 numbers: ";
    for (int i = 0; i < 5; ++i) {
        cin >> *(arr + i) ;
    }

    // Hiển thị dữ liệu sử dụng ký hiệu con trỏ
    cout << "Displaying data: " << endl;
    for (int i = 0; i < 5; ++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