Bài 63. Con trỏ trong C

Con Trỏ Trong C
Con trỏ trong C là một loại biến đặc biệt mà giá trị của nó là địa chỉ của 1 biến khác

Trong bài học này, Lập trình không khó sẽ hướng dẫn các bạn cách sử dụng con trỏ trong ngôn ngữ lập trình C. Bài viết này sẽ giúp các bạn hiểu thế nào là con trỏ, các khái niệm cơ bản liên quan đến con trỏ cũng như cách sử dụng con trỏ trong C. Con trỏ là phần kiến thức khá rộng, do đó bài viết này sẽ hướng dẫn về con trỏ cơ bản; Các bài viết tiếp theo sẽ trình bày chi tiết hơn con trỏ khi làm việc với mảng, cấp phát bộ nhớ và quản lý bộ nhớ,… Mình hi vọng loạt bài học về con trỏ trong C này sẽ giúp các bạn tự tin hơn.

Con Trỏ Trong C
Con trỏ trong C là một loại biến đặc biệt mà giá trị của nó là địa chỉ của 1 biến khác.

Địa chỉ của biến trong C

Để hiểu và sử dụng được con trỏ trong C, trước tiên bạn cần hiểu về khái niệm địa chỉ ở trong C. Nếu bạn nào theo dõi khóa học C bá đạo của mình từ đầu thì chắc đã thấy mình nhắc tới khái niệm này rồi. Phần này ta sẽ làm rõ vấn đề này.

Bạn hãy nhìn ví dụ trên, tại sao khi dùng hàm scanf chúng ta cần truyền vào &number, còn hàm printf ta lại không có dấu & kia? Bởi vì nếu bạn muốn nhập giá trị cho biến, hàm scanf cần biết địa chỉ của biến đó ở trong bộ nhớ.

Mỗi biến mà bạn khai báo đều có địa chỉ riêng của nó và giá trị mà nó đang lưu trữ. Để xem được địa chỉ của biến, bạn thêm dấu & vào trước tên biến. Xem xét ví dụ dưới đây:

Kết quả khi chạy chương trình:

Chú ý: 

  • Bạn có thể sẽ nhận được các địa chỉ khác nhau mỗi khi chạy code trên.
  • Để nhận giá trị địa chỉ là hexa như ảnh ở đâu bài, bạn thay %d bằng %x là được.

Con trỏ trong C

Con trỏ là gì? Con trỏ trong C cũng chỉ là là biến, cũng có thể khai báo, khởi tạo và lưu trữ giá trị và có địa chỉ của riêng nó. Nhưng biến con trỏ không lưu giá trị bình thường, nó là biến trỏ tới 1 địa chỉ khác, tức mang giá trị là 1 địa chỉ.

Chúng ta cùng thống nhất 1 số khái niệm khi làm việc với con trỏ nhé:

  • Giá trị của con trỏ: địa chỉ mà con trỏ trỏ đến.
  • Địa chỉ của con trỏ: địa chỉ của bản thân biến con trỏ đó.
  • Giá trị của biến nơi con trỏ đang trỏ tới.
  • Địa chỉ của biến nơi con trỏ đang trỏ tới = giá trị của con trỏ.

Chính vì con trỏ mang địa chỉ, nó là 1 biến đặc biệt có thêm những quyền năng mà biến bình thường không có. Nhờ việc nó mang địa chỉ, nó có thể trỏ lung tung trong bộ nhớ. Đây là 1 điểm mạnh nếu ta khai thác tốt nhưng nếu quản lý không tốt thì lại là 1 tai hại.

Cách khai báo con trỏ

Con trỏ trong C cũng có thể khai báo giống như biến bình thường, tên biến là một định danh hợp lệ. Cú pháp như sau:

Trong đó:

  • Kiểu dữ liệu có thể là: void, int, float, double,…
  • Dấu * trước tên biến là ký hiệu báo cho trình biên dịch biết ta đang khai báo con trỏ.

Gán giá trị cho con trỏ

Sau khi khai báo con trỏ, bạn cần khởi tạo giá trị cho nó. Nếu con trỏ được sử dụng mà không được khởi tạo, giá trị của nó sẽ là giá trị rác, điều này sẽ làm chương trình của bạn chạy không đúng, thậm chí là nguy hiểm nếu giá trị rác đó chẳng may lại chính là địa chỉ của 1 biến nào đó bạn đang dùng.

Hoặc bạn cũng có thể khai báo và khởi tạo đồng thời:

Lưu ý:

  • Con trỏ khi khai báo nên được khởi tạo giá trị ngay.
  • Con trỏ kiểu void là loại biến con trỏ tổng quát, nó có thể nhận địa chỉ của biến bất kỳ ở bất cứ kiểu dữ liệu nào.

  • Khởi tạo con trỏ bằng địa chỉ NULL nếu chưa cần dùng theo cách sau: int *p = NULL. Khi đó con trỏ NULL luôn có giá trị 0.

 Bản chất của con trỏ trong C

Bạn sẽ hiểu rõ hơn các quyền năng của con trỏ trong phần này, cũng xem ví dụ dưới đây nào:

Kết quả chạy:

Qua ví dụ này, bạn có thể thấy rõ sự đúng đắn của các kết luận sau đây về con trỏ:

  • Địa chỉ của biến value chính là giá trị của con trỏ p, đều là 6487580. Lưu ý mỗi lần chạy thì giá trị địa chỉ này có thể khác nhau nhé.
  • Con trỏ có thể lấy giá trị của biến mà nó đang trỏ tới bằng toán tử *: printf("\nDia tri cua con tro p = %d", *p);
  • Con trỏ có thể thay đổi giá trị của biến mà nó đang trỏ tới. Do nó mang địa chỉ của biến, khi đó nó hoàn toàn có quyền thay đổi giá trị của biến đó. Như ở ví dụ trên ta thay đổi giá trị từ 10 lên 100.

Bài học hôm nay chúng ta sẽ chỉ dừng lại ở các kiến thức phía trên, các bài học sau chúng ta sẽ cùng nhau đi tìm hiểu về mối liên hệ giữa con trỏ với mảng và con trỏ với hàm cũng như cách quản lý bộ nhớ khi làm việc với con trỏ trong C.

Các lỗi thường gặp khi làm việc với con trỏ

Giả sử bạn muốn khởi tạo giá trị của con trỏ p trỏ tới địa chỉ của biến value, khi đó:

Các bạn khi mới học con trỏ sẽ mông lung về dấu * ở phần khai báo và khi lấy giá trị của biến mà con trỏ đang trỏ tới:

Tài liệu tham khảo

Mặc dù mình đã cố gắng trình bày tỉ mỉ, nhưng có thể còn thiếu sót. Dưới đây là 1 số tài liệu bạn nên đọc thêm để hiểu hơn về con trỏ trong C:

  1. Tìm hiểu bản chất của con trỏ từ cơ bản tới nâng cao
  2. C Pointers (With Example)
avatar
  Subscribe  
newest oldest most voted
Notify of
Nhaan
Guest
Nhaan

Cảm ơn anh đã chỉ dẫn. Giờ e thông não rồi hehee

Minh Mờ Inh
Member
Minh Mờ Inh

anh cho em hỏi cái dòng //14 15 của ảnh cuối cùng a có ghi : Lấy địa chỉ của biến mà con trỏ đang trỏ tới
printf (“%d , *p ) ; // 5

tức là địa chỉ của 5 hay giá trị vậy a ?

Hai Pham
Guest
Hai Pham

Em cảm ơn những bài giảng của anh ạ!

Hào Quốc
Member
Hào Quốc

lợi ích của con trỏ là gì anh ,cần gì giá trị của này là địa chỉ của kia chi cho rắc rối vậy ạ

Ha Nguyen Hau
Guest
Ha Nguyen Hau

Cảm mơn anh, bài viết hay và dễ hiểu nhất

phạm hồng hoạt
Guest
phạm hồng hoạt

2019, cảm ơn anh Hiếu nhiều!