🌱 C/C++ Pointer - Con trỏ

🌱 C/C++ Pointer - Con trỏ

Một khái niệm cực quan trọng trong C/C++, đó là pointer - con trỏ, phát huy điểm mạnh tương tác với hardware (memory) của C/C++.

    Pointer - Con trỏ, được hiểu là một biến, chứa địa chỉ của một ô nhớ (có thể là địa chỉ của biến khác, hàm, ...).

    👉 Khái niệm địa chỉ trong C/C++

    Nếu có một biến var trong C/C++, chúng ta có thể dùng toán tử & để truy xuất đến địa chỉ của nó - &var.

    🔻 Ví dụ in ra địa chỉ các biến

#include <iostream>
using namespace std;

int main()
{
    int var1 = 3;
    double var2 = 17.32;

    cout << "Address of var1: " << &var1 << endl;
    cout << "Address of var2: " << &var2 << endl;
    cout << "Size of var1 Address: " << sizeof(&var1) << endl;
cout << "Size of var2 Address: " << sizeof(&var2) << endl; }     Run This Code    

    ➥ Các bạn có thể bấm "Run This Code", kết quả hiển thị trên màn hình console như sau.

Address of var1: 0x7fff8e371f2c
Address of var2: 0x7fff8e371f30
Size of var1 Address: 8
Size of var2 Address: 8

    Dễ thấy các địa chỉ được in ra dưới dạng hexa, với tiền tố 0x. Đoạn code trên còn in ra thêm một thông số đó là sizeof của địa chỉ. Ở đây, địa chỉ của số nguyên int, và địa chỉ của số double đều là 8 (bytes).

    Kết luận. Ở đây máy mình đang sử dụng có kiến trúc 64-bits, vì vậy, nó sẽ cung cấp 64-bits, hay 8 bytes, để đánh địa chỉ, nên địa chỉ của các biến trên máy 64-bits sẽ luôn có kích thước (sizeof) là 64-bits hay 8 bytes. Tương tự, khi chạy trên các kiến trúc khác, ví dụ 32-bits, kích thước của địa chỉ sẽ có kích thước 32-bits, hay 4 bytes.

    👉 C/C++ Pointer

    Như đã đề cập ở trên, Pointers là một biến - dùng để lưu trữ địa chỉ một ô nhớ. Dưới đây là cách khai báo một biến Pointer.

int * pointVar;       // Junk Address: could be anything
int * pointVar {};    // Declare pointer with NULL value
int * pointVar {nullptr};    // Declare NULL pointer
int * pointVar {&num};    // Declare pointer to num variable

    Ở đây, pointVar là một biến con trỏ, chứa địa chỉ của một biến kiểu int.

    🔻 Ví dụ sử dụng Pointer

#include <iostream>
using namespace std;
int main()
{
    int var = 5;
    int* pointVar;

    // store address of var
    pointVar = &var;

    // print value of var
    cout << "var = " << var << endl;

    // print address of var
    cout << "Address of var (&var) = " << &var << endl << endl;

    // print pointer pointVar
    cout << "pointVar = " << pointVar << endl;

    // print the content of the address pointVar points to
    cout << "Content of the address pointed to by pointVar (*pointVar) = " << *pointVar << endl;
    return 0;
}

    Run This Code    

    ➥ Các bạn có thể bấm "Run This Code", kết quả hiển thị trên màn hình console như sau.

var = 5
Address of var (&var) = 0x61ff08

pointVar = 0x61ff08
Content of the address pointed to by pointVar (*pointVar) = 5

cpp-pointer-working
Hoạt động của Pointer

    🔻 Gán địa chỉ vào Pointer

int* pointVar, var;
var = 5;

// assign address of var to pointVar pointer
pointVar = &var;

    Như đề cập ở trên, toán tử & để lấy địa chỉ của một biến, nó sẽ phù hợp với giá trị của một biến Pointer. Ở đây, biến var có giá trị là 5. Địa chỉ của biến var sẽ được gán vào biến con trỏ pointVar - pointVar = &var;

    🔻 Lấy giá trị từ một địa chỉ

    Toán tử * được sử dụng với Pointer, gọi là toán tử dereference, nó được sử dụng để lấy ra giá trị từ một địa chỉ, hoặc một con trỏ. Giá trị được lấy ra (có kích thước bao nhiêu byte), sẽ phụ thuộc vào kiểu dữ liệu của con trỏ.

int* pointVar, var;
var = 5;

// assign address of var to pointVar
pointVar = &var;

// access value pointed by pointVar
cout << *pointVar << endl;   // Output: 5

    Ở đây pointerVar là một con trỏ chứa địa chỉ của một biến var, có kiểu dữ liệu int. Vì vậy, có thể sử dụng *pointVar để lấy ra giá trị được chứa trong ô nhớ đó. Vì pointVar là một con trỏ có kiểu dữ liệu int*, nên nó sẽ lấy được giá trị của 4 bytes ô nhớ, tức là một số nguyên int.

    🔻 Thay đổi giá trị của biến sử dụng Pointer

    Nếu con trỏ pointVar chứa địa chỉ của biến var, chúng ta có thể thay đổi giá trị của biến var bằng các sử dụng toán tử *, đó là *pointVar. Ví dụ,

int var = 5;
int* pointVar;

// assign address of var
pointVar = &var;

// change value at address pointVar
*pointVar = 1;

cout << var << endl; // Output: 1

    👉 Một số lỗi khi làm việc với Pointer

int var, *varPoint;

// Wrong! 
// varPoint is an address but var is not
varPoint = var;

// Wrong!
// &var is an address
// *varPoint is the value stored in &var
*varPoint = &var;

// Correct! 
// varPoint is an address and so is &var
varPoint = &var;

 // Correct!
// both *varPoint and var are values
*varPoint = var;

>>>= Follow ngay =<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊

Chúc các bạn học tập tốt 😊

                                        

Nguyễn Văn Nghĩa

Mình là một người thích học hỏi và chia sẻ các kiến thức về Nhúng IOT.

Đăng nhận xét

Mới hơn Cũ hơn