Cách hoạt động của con trỏ trong C/C++

0
1301

Phần lớn những người bắt đầu học C/C++ thường xuyên vấp ngã trong phần kiến thức về con trỏ. Và mình hi vọng bài học này sẽ giúp các bạn không nằm trong số đó. Hãy tập trung gấp đôi bình thường và bỏ thêm thời gian để hiểu rõ từng biểu đồ, ví dụ có trong bài học này ^_^ !

Các vấn đề cần sử dụng con trỏ

Trả về nhiều kết quả

Giả sử ta viết một hàm để trả về hai giá trị, đều này là không thể vì mỗi hàm chỉ return được một lần mà thôi !

Ở ví dụ trên thì ta chỉ có thể trả về một giá trị value có kiểu là int mà thôi. Nhưng nếu khai báo là void thì hàm thậm chí còn không trả về giá trị nữa.

Giả sử bây giờ mình muốn viết một function nhập vào số phút và chuyển nó thành giờ và phút:

  • Nếu ta đưa vào giá trị 45, function sẽ trả về 0 giờ và 45 phút.
  • Nếu ta đưa vào giá trị 65, function sẽ trả về 0 giờ và 5 phút

 

Ồ chương trình đã không hoạt động đúng. Tiếp theo các bạn hãy thay đổi kiểu trả về là int, thì bạn cũng chỉ nhận được một trong hai kết quả mà thôi. Lưu ý là không được dùng biến toàn cục nhé. Bây giờ bạn sẽ giải quyết vấn đề trên như thế nào ?

 

Sử dụng để cấp phát động

Một vấn đề khác đó là bạn tạo ra một mảng có 100 phần tử, nhưng chỉ sử dụng 10 phần tử trong đó thôi. Điều này sẽ làm lãng phí bộ nhớ. Nhưng nếu bạn tạo một mảng chỉ có 10 phần tử, giờ bài toán bắt buộc phải nhập nhiều hơn 10 phần tử và không có giá trị củ thể cho bạn. Có thể là 100 hoặc lớn hơn, bạn sẽ làm gì? tạo ra mảng có 1000 phần tử à.

Việc sử dụng con trỏ để cấp phát động sẽ giúp các bạn sử dụng mảng linh hoạt và tiết kiệm bộ nhớ hơn rất nhiều.

Nãy giờ mình toàn nói lan man về con trỏ, vậy con trỏ là gì? Chúng ta cùng tìm hiểu nhé.

Con trỏ là gì và cách hoạt động của con trỏ

Con trỏ là gì

Đưới đây là biểu đồ mô phỏng cách trình bày một RAM trong máy tính của bạn.

 

Con trỏ trong C/C++
Cách sắp xếp trong bộ nhớ(RAM)

Hãy đọc kĩ từng dòng trong biểu đồ. Dòng đầu tiên tương ứng với “ô” đầu tiên của bộ nhớ (RAM). Mỗi ô tương ứng với một số, là địa chỉ của nó (address)! Bộ nhớ chứa một số lượng lớn địa chỉ, bắt đầu từ địa chỉ 0 đến một số nào đó (một số vô cùng lớn, số lượng địa chỉ phụ thuộc vào dung lượng bộ nhớ được lắp đặt trong từng máy tính).

Mỗi địa chỉ có thể chứa một số. Một và chỉ một. Ta không thể nào chứa 2 số trong cùng một địa chỉ. Bộ nhớ của bạn tạo ra chỉ để chứa những con số. Nó không thể chứa chữ cái cũng như đoạn văn. Vì vậy bảng mã ASCII ra đời nhằm giúp máy tính chuyển những kí tự thành số để máy tính có thể lưu được.

Cách hoạt động của con trỏ

Khi bạn khai báo một biến

Thì chương trình của bạn sẽ yêu cầu HĐH(ví dụ Windows) cấp phát một ít bộ nhớ và sẽ trả lại địa chỉ bộ nhớ(ví dụ 123) cho chương trình sử dụng. Bây giờ chương trình sẽ thay tuoi thành 123 để có thể sử dụng được vùng nhớ đó. Và tất nhiên tại địa chỉ 123 sẽ lưu giá trị là 0.

Để xem địa chỉ con trỏ ta có thể làm như sau

Đó chính là địa chỉ của bộ nhớ tại thời điểm ta biên dịch. Nó có thể khác nhau tại mỗi lần biên dịch. Nếu bạn thay %p thành %d thì địa chỉ sẽ được ghi dưới dạng hệ 10.

Bài viết tiếp theo mình sẽ giới thiệu cho các bạn cách sử dụng con trỏ trong C/C++. Bài viết mình đến đây là kết thúc. Cám ơn các bạn đã theo dõi !

 

avatar
  Subscribe  
Notify of