Giới thiệu về con trỏ trong C
- Trong ngôn ngữ lập trình C, con trỏ là một biến đặc biệt được sử dụng để lưu trữ địa chỉ của một biến khác. Nó cho phép chúng ta truy cập và thay đổi giá trị của biến mục tiêu thông qua địa chỉ của nó. Con trỏ là một khái niệm mạnh mẽ và cần thiết trong C, cho phép chúng ta thực hiện các tác vụ phức tạp như cấp phát động bộ nhớ và thao tác trên mảng. Để khai báo một con trỏ trong C, chúng ta sử dụng dấu sao (*) trước tên biến. Ví dụ, khai báo một con trỏ kiểu nguyên int như sau: int *ptr;
Sau khi con trỏ được khai báo, chúng ta có thể gán cho nó địa chỉ của một biến bằng toán tử &. Ví dụ:
int num = 10;
int *ptr;
ptr = # // Gán địa chỉ của biến num cho con trỏ ptr
- Chúng ta cũng có thể truy cập đến giá trị của biến mục tiêu bằng cách sử dụng con trỏ. Để truy cập giá trị, chúng ta sử dụng toán tử * trước tên con trỏ. Ví dụ: int value = *ptr; // Lấy giá trị tại địa chỉ mà con trỏ ptr đang trỏ đến
- Con trỏ trong C cũng được sử dụng rộng rãi trong việc quản lý bộ nhớ động. Chúng ta có thể cấp phát và giải phóng bộ nhớ trong thời gian chạy bằng các hàm như malloc(), calloc(), và free(). Con trỏ cũng cho phép chúng ta thực hiện các thao tác trên mảng, bằng cách sử dụng các con trỏ và phép tính số học con trỏ.
Ví dụ về các thao tác trên mảng:
Ví dụ về malloc():
Trong ví dụ trên, chúng ta sử dụng hàm malloc() để cấp phát 5 phần tử kiểu int trong bộ nhớ động. Trước khi sử dụng con trỏ ptr, ta kiểm tra xem con trỏ có bằng NULL hay không để đảm bảo rằng việc cấp phát bộ nhớ đã thành công. Sau đó, chúng ta gán giá trị cho các phần tử trong mảng và in chúng ra màn hình. Cuối cùng, chúng ta giải phóng bộ nhớ đã được cấp phát bằng cách sử dụng hàm free().
Ví dụ về calloc():
Trong ví dụ này, chúng ta sử dụng hàm calloc() để cấp phát 5 phần tử kiểu int và khởi tạo giá trị 0 cho từng phần tử. Sau đó, chúng ta in giá trị các phần tử trong mảng và giải phóng bộ nhớ đã được cấp phát bằng hàm free()
Lưu ý: Cả hai hàm malloc() và malloc() đều được sử dụng để cấp phát bộ nhớ động, nhưng khác nhau ở cách khởi tạo giá trị ban đầu cho phần tử trong mảng. malloc() không khởi tạo giá trị ban đầu, trong khi calloc() khởi tạo giá trị 0 cho các phần tử.
Ví dụ về free():
Trong ví dụ này, chúng ta cấp phát 1 phần tử kiểu int trong bộ nhớ động bằng hàm malloc(). Sau đó, chúng ta gán giá trị 10 cho phần tử và in giá trị đó ra màn hình. Cuối cùng, chúng ta giải phóng bộ nhớ đã được cấp phát bằng hàm free().