Nguồn: Click here

1. Định nghĩa con trỏ

Trong C, con trỏ là một biến cụ thể được sử dụng để lưu trữ địa chỉ bộ nhớ của một biến khác. Nó cho phép chúng ta truy cập và sử dụng biến từ nhiều nơi trong chương trình mà không cần biết chính xác địa chỉ của nó.

2. Cách khai báo:

Cách khai báo con trỏ trong C là sử dụng ký tự '*' trước tên biến. Ví dụ, để khai báo một con trỏ cho kiểu int, chúng ta sẽ sử dụng cú pháp sau: int *ptr;

3. Ví dụ về sử dụng con trỏ trong C

#include <stdio.h>
int main()
{
    int a = 10;
    int *ptr;
    ptr = &a;
    printf("Value of a: %d\n", a);
    printf("Address of a: %p\n", &a);
    printf("Value of ptr: %p\n", ptr);
    printf("Value pointed to by ptr: %d\n", *ptr);
    return 0;
}
Trong ví dụ trên, biến a là một biến kiểu int và ptr là một con trỏ đến kiểu int. Chúng ta gán giá trị địa chỉ của a cho ptr và sử dụng toán tử * để truy cập giá trị tại địa chỉ mà ptr trỏ đến.

4. Con trỏ số học

Cộng con trỏ:

#include <stdio.h>

int main() {
int arr[] = {1, 2, 3, 4, 5};
//p trỏ tới mảng, là trỏ tới phần tử đầu tiên của mảng
int *p = arr;
printf("- Value: %d\n", *p);
printf("- Address: %p\n", p);

printf("1. After incrementing p for the first time: \n");
//tăng p lên 1, nghĩa là p trỏ tới phần tử thứ 2 của mảng
p++;
printf("- Value: %d\n", *p);
printf("- Address: %p\n", p); //địa chỉ tăng lên 4

printf("2. After incrementing p for the second time: \n");
//tiếp tục tăng p lên 1, lần này p trỏ tới phần tử thứ 3 của mảng
p++;
printf("- Value: %d\n", *p);
printf("- Address: %p\n", p); //địa chỉ tăng lên 4

return 0;
}

Trừ con trỏ:

#include <stdio.h>

int main() {
int arr[] = {1, 2, 3, 4, 5};
//p trỏ tới phần tử cuối của mảng, p chứa địa chỉ của phần tử thứ 5
int *p = &arr[4]; //chú ý dấu &
printf("- Value: %d\n", *p);
printf("- Address: %p\n", p);

printf("1. After decrementing p for the first time: \n");
//giảm p đi 1, nghĩa là p trỏ tới phần tử thứ 4 của mảng
p--;
printf("- Value: %d\n", *p);
printf("- Address: %p\n", p);//địa chỉ giảm đi 4

printf("2. After decrementing p for the second time: \n");
//tiếp tục giảm p đi 1, lần này p trỏ tới phần tử thứ 3 của mảng
p--;
printf("- Value: %d\n", *p);
printf("- Address: %p\n", p);

return 0;
}

So sánh con trỏ:
Con trỏ có thể được so sánh bằng cách sử dụng các toán tử quan hệ, chẳng hạn như ==, < và >.
#include <stdio.h>

const int MAX = 3;
int main () {
int var[] = {10, 100, 200};
int i, *ptr;

ptr = var;//ptr chứa địa chỉ của phần tử đầu tiên của mảng
i = 0;
while ( ptr <= &var[MAX - 1] ) {//so sánh con trỏ

printf("Address of var[%d] = %p\n", i, ptr );
printf("Value of var[%d] = %d\n", i, *ptr );

ptr++;//ptr trỏ tới vùng nhớ tiếp theo
i++;
}
return 0;
}
 

5. Ứng dụng thực tế sử dụng con trỏ 

Con trỏ C có nhiều ứng dụng thực tế, sau đây là 1 số ứng dụng:

  • Cấp phát bộ nhớ động: Con trỏ có thể được sử dụng để cấp phát bộ nhớ động trong thời gian chạy, thay vì bị giới hạn ở một kích thước cố định tại thời điểm biên dịch.
  • Đối số của hàm: Con trỏ có thể được truyền dưới dạng đối số cho hàm, cho phép hàm sửa đổi các giá trị bên ngoài phạm vi của chúng.
  • Cấu trúc dữ liệu động: Con trỏ có thể được sử dụng để xây dựng cấu trúc dữ liệu động, chẳng hạn như danh sách được liên kết và cây, có thể tăng hoặc giảm khi cần.
  • Tệp I/O: Con trỏ có thể được sử dụng để đọc và ghi dữ liệu vào tệp.
  • Thao tác chuỗi: Con trỏ có thể được sử dụng để thao tác với chuỗi, bao gồm sao chép, nối và tìm kiếm chuỗi.
  • Giao diện với phần cứng: Con trỏ có thể được sử dụng để truy cập các thiết bị phần cứng, chẳng hạn như I/O được ánh xạ bộ nhớ.
  • Lập chỉ mục mảng: Con trỏ có thể được sử dụng để lập chỉ mục vào mảng, cho phép truy cập hiệu quả hơn tới các phần tử mảng.

Nguồn: chatGPT và Internet