Mở đầu
Đã đến lúc chúng ta tìm hiểu về con trỏ. Hãy ra hít một hơi thật sâu trước khi bắt đầu vì tôi biết bài học này chắc chắn sẽ không khiến bạn thấy thú vị. Nhưng con trỏ là một khái niệm được sử dụng rất thường xuyên trong C. Nói về tầm quan trọng, chúng ta không thể nào lập trình trên ngôn ngữ C mà không dùng đến con trỏ, và bạn cũng đã từng dùng nó mà không biết.
Phần lớn những người bắt đầu học C thường xuyên vấp ngã trong phần kiến thức về con trỏ. Và tôi 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.
Một vấn đề nan giải
Đây là một trong những vấn đề lớn liên quan đến con trỏ, các bạn mới bắt đầu thường bị nhầm lẫn, cảm thấy khó khăn trong việc nắm vững cách hoạt động và sử dụng. "Con trỏ rất cần thiết, và chúng ta sẽ thường xuyên dùng đến nó, hãy tin tôi !" Tôi sẽ cho bạn xem một ví dụ mà các bạn không thể nào giải quyết được nếu không sử dụng đến con trỏ. Đây cũng là tiêu điểm của bài học này, tôi sẽ hướng dẫn cách giải quyết ở cuối bài học. Đây là vấn đề: Tôi muốn viết một function trả về hai giá trị. Việc này là không thể vì mỗi function chỉ có thể trả về duy nhất một giá trị.
C code:
C code:
Giả sử tôi muốn viết một function, trong parameter tôi sẽ cho nó một giá trị tính bằng phút, tôi muốn nó chuyển thành giờ và phút tương ứng:
- 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ị 60, function sẽ trả về 1 giờ và 0 phút.
- Nếu ta đưa vào giá trị 60, function sẽ trả về 1 giờ và 30 phút .
Nhìn có vẻ khá đơn giản, nhưng hãy cùng test đoạn code sau:
C code:
Và đây là kết quả:
Console
Ặc... chương trình đã không hoạt động. Vì sao vậy?
Khi bạn gửi giá trị của một biến số vào vị trí parameter của một function, một bản sao của biến số này được tạo ra. Nói cách khác, biến số "gio" trong function chuyenDoi không phải là biến số "gio" trong function main! Nó chỉ là bản sao!
Function chuyenDoi đã thực hiện nhiệm vụ của nó. Trong function chuyenDoi, những biến số "gio" và "phut" nhận giá trị chính xác: 1 và 30.
Nhưng sau đó, function kết thúc khi dấu ngoặc } đóng lại. Như ta đã học ở bài học trước, tất cả những biến số tạo ra trong một function sẽ bị xóa đi khi function đó kết thúc. Và ở đây, biến số gio và phut đã bị xóa đi. Sau đó chương trình tiếp tục phần tiếp theo của main, và ở đó biến số gio và phut của main giá trị vẫn là 0 và 90. Đó là lí do bạn thất bại!
Và đó là vấn đề khó khăn đặt ra , vậy con trỏ sẽ giải quyết vấn đề trên như thế nào?