[Tutorial] Hướng dẫn con trỏ trong C

Để viết được một bài chia sẻ mất khá nhiều thời gian, mà vắng người xem quá cơ :pensive:

Bạn nào đang học C mà chưa rõ con trỏ là gì thì vào đọc nhé, Anh chị em bạn bè nào biết rồi thì qua ủng hộ và cho nhận xét về bài hướng dẫn con trỏ cơ bản trong C để mình tiếp tục cải thiện :sweat_smile:
image

Một đoạn code ví dụ cho chúng ta thấy những khả năng của con trỏ:

#include <stdio.h>
int main()
{
  // Khai báo + khởi tạo biến value = 10
  int value = 10;
 
  // Lấy giá trị của biến value
  printf("\nGia tri cua `value` = %d", value);
  // Lấy địa chỉ của biến value
  printf("\nDia tri cua `value` = %d", &value);
 
  printf("\n-------------------\n");
 
  /* 
  Khai báo + khởi tạo biến con trỏ p 
  có giá trị là địa chỉ của biến value 
  */
  int *p = &value;
 
  // Lấy giá trị của con trỏ p
  printf("\nGia tri cua con tro `p` = %d", p);
  // Lấy địa chỉ của con trỏ p
  printf("\nDia tri cua con tro `p` = %d", &p);
  // Lấy giá trị của biến ma con trỏ p đang trỏ tới dùng toán tử *
  printf("\nGia tri cua bien ma con tro `p` dang tro toi = %d", *p);
 
  printf("\n-------------------\n");
 
  /* 
  Thay đổi giá trị của biến value thông qua con trỏ p
  Giống như hàm scanf() có thể thay đổi giá trị của biến khi nhận vào địa chỉ,
  con trỏ khi có địa chỉ của 1 biến hoàn toàn có thể thay đổi giá trị của
  biến đó theo cách dưới đây: 
  */
  // Lấy giá trị của biến value
  printf("\nGia tri cua `value` = %d", value);
  // Thay đổi giá trị của biến value thông qua `p`
  *p = 100;
  // Lấy giá trị của biến value
  printf("\nGia tri cua `value` = %d", value);
  // Lấy giá trị của biến ma con trỏ p đang trỏ tới dùng toán tử *
  printf("\nGia tri cua bien ma con tro `p` dang tro toi = %d", *p);
 
  printf("\n-------------------\n");
 
  /*
  Việc lấy giá trị của biến thông qua con trỏ 
  chỉ là 1 cách khác để lấy được giá trị của biến đó. 
  
  */
  value = 1000;
  // Lấy giá trị của biến value
  printf("\nGia tri cua `value` = %d", value);
  // Lấy giá trị của biến ma con trỏ p đang trỏ tới dùng toán tử *
  printf("\nGia tri cua bien ma con tro `p` dang tro toi = %d", *p);
}

Kết quả chạy:

Gia tri cua `value` = 10
Dia tri cua `value` = 6487580
-------------------
 
Gia tri cua con tro `p` = 6487580
Dia tri cua con tro `p` = 6487568
Gia tri cua bien ma con tro `p` dang tro toi = 10
-------------------
 
Gia tri cua `value` = 10
Gia tri cua `value` = 100
Gia tri cua bien ma con tro `p` dang tro toi = 100
-------------------
 
Gia tri cua `value` = 1000
Gia tri cua bien ma con tro `p` dang tro toi = 1000

6 Likes

Trong C thì con trỏ khá là quan trọng.

C mà không có con trỏ thì cũng như Đường Tăng đi lấy kinh mà không có Tôn Ngộ Không vậy. :laughing:

Dù sao cũng cảm ơn anh đã giành thời gian chia sẻ, hi vọng những bạn học C còn đang mông lung về phần này có thể hiểu được. :slight_smile:

4 Likes

có thêm cái hình minh họa thì hay hơn, phương Tây có câu “A picture is worth a thousand words” mà :V

6 Likes

Hi Hieu Nguyen Van.
Theo mình thì nên phân biệt kiểu dữ liệu con trỏ và biến có kiểu là con trỏ.
int *p: int * là kiểu dữ liệu và p là tên biến. Như thế sẽ logic. 1. Toán tử thường được áp dụng cho một kiểu dữ liệu. VD phép toán chia lấy dư và nguyên áp dụng cho kiểu số nguyên. Các phép toán ++, -- trên các kiểu dữ liệu khác nhau thực hiện khác nhau.
2. Các phép toán ép kiểu thường áp dụng với đọc ghi bộ đệm. Bộ đêm chỉ là một vùng nhớ byte liên tiếp được xác định bởi kích thước và địa chỉ bắt đầu. Nếu trong đó có các biến kiểu khác nhau VD: char, int, int, int[xxx] v.v.v…

P/S Mình rất mong bài viết tới bạn có thể giải thích rõ hơn cơ chế chuyền biến vào cho hàm, cách lấy ra và tác dụng của con trỏ và cấu trúc bộ nhớ chủa chương trình.

3 Likes

Mình có ảnh mà, à quên đưa lên đây. :blush:

1 Like

Cảm ơn bạn góp ý, nhưng mình thực sự không hiểu ý của bạn :pensive:

Con trỏ là biến lưu địa chỉ của một vùng nhớ.
Có địa chỉ thì có thể tương tác với vùng nhớ mà con trỏ đang trỏ tới.
Ngoài việc lưu địa chỉ, con trỏ không còn biết bất cứ một thông tin nào của vùng nhớ mà nó đang giữ địa chỉ.
Chỉ có đơn giản như vậy thôi.

5 Likes

Cách tốt nhất để hiểu con trỏ nói chung là học assembly. Khi đó thì hiểu rằng syntax của các ngôn ngữ lập trình cũng chỉ là cái luật, một lớp trừu tượng để lập trình trở nên dễ dàng và an toàn hơn.

4 Likes

Mô phỏng cái RAM rồi viết luôn mã binary là dễ hiểu :penguin:
Vẽ hơi cực tí xíu à :upside_down_face:

6 Likes

“con trỏ trỏ tới địa chỉ của biến” nghe nó ko hợp lý sao ấy :V con trỏ trỏ tới biến x chứ có ai nói trỏ tới địa chỉ của biến x đâu :V Con trỏ chứa địa chỉ của biến x == con trỏ trỏ tới biến x.

cái dễ hiểu nhất là coi chương trình cuộc đua kì thú ấy. Mẩu giấy mật thư ghi thử thách tiếp theo là con trỏ :V :V :V Mật thư trỏ tới thử thách tiếp theo == trong mật thư có ghi địa chỉ của thử thách tiếp theo. Cả chương trình là 1 danh sách liên kết à ko cây nhị phân chứ nhỉ :joy:

5 Likes

Cảm ơn anh em góp ý nhé, mình sẽ edit lại lời văn cho hợp lý nhất.

học con trỏ làm mình liên tưởng đến symbolic link trong linux ! hihihi

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?