Xem thêm

Bài 65. Con trỏ và hàm trong C

Huy Erick
Trong lĩnh vực lập trình, kiến thức về con trỏ và hàm trong ngôn ngữ C là rất quan trọng. Trong bài viết này, chúng ta sẽ đi vào chi tiết về việc sử dụng...

Trong lĩnh vực lập trình, kiến thức về con trỏ và hàm trong ngôn ngữ C là rất quan trọng. Trong bài viết này, chúng ta sẽ đi vào chi tiết về việc sử dụng con trỏ và truyền con trỏ vào hàm. Hiểu rõ vấn đề này sẽ giúp bạn nắm bắt được tư duy lập trình và áp dụng hiệu quả trong công việc của mình.

Mối liên hệ giữa con trỏ và hàm

Trong ngôn ngữ lập trình C, bạn có thể truyền địa chỉ của biến hoặc con trỏ làm tham số cho một hàm. Để hàm có thể nhận địa chỉ, ta sử dụng biến con trỏ làm tham số. Dưới đây là một ví dụ để bạn hiểu rõ hơn vấn đề này:

Tham Chiếu Và Tham Trị

Nếu bạn đang quan tâm đến tham trị và tham chiếu trong ngôn ngữ C++, bạn có thể xem bài viết tương ứng.

Tham chiếu trong C

Lưu ý: Tham chiếu là một khái niệm chỉ tồn tại trong ngôn ngữ C++. Trong ngôn ngữ C, chúng ta có thể sử dụng truyền con trỏ để thực hiện tương tự như tham chiếu. Đối với truyền giá trị, cả C và C++ đều tương tự.

Hãy xem xét ví dụ dưới đây để thấy rõ hơn về cách sử dụng con trỏ trong C:

#include   void swap(int a, int b) {     printf("Hàm con, trước khi gọi hàm hoán vị, a = %d, b = %d\n", a , b);      int tmp = a;     a = b;     b = tmp;      printf("Hàm con, sau khi gọi hàm hoán vị, a = %d, b = %d\n", a , b); }  int main() {     int a = 5, b = 7;      printf("Hàm main, trước khi gọi hàm hoán vị, a = %d, b = %d\n", a , b);      swap(a, b);      printf("Hàm main, sau khi gọi hàm hoán vị, a = %d, b = %d\n", a , b);      return 0; }

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

Hàm main, trước khi gọi hàm hoán vị, a = 5, b = 7 Hàm con, trước khi gọi hàm hoán vị, a = 5, b = 7 Hàm con, sau khi gọi hàm hoán vị, a = 7, b = 5 Hàm main, sau khi gọi hàm hoán vị, a = 5, b = 7

Bạn có thể thấy rõ rằng hàm con không thay đổi giá trị của biến ab trong hàm main(). Điều này xảy ra vì khi gọi hàm swap(), hai tham số được sao chép sang hai vùng nhớ khác nhau, và mọi thay đổi chỉ được áp dụng trên các bản sao này.

Bây giờ, hãy thử truyền con trỏ như sau:

#include   // Tham số đầu vào là hai biến con trỏ kiểu int void swap(int *a, int *b) {     // Sử dụng * để lấy giá trị của biến mà con trỏ đang trỏ tới     printf("Hàm con, trước khi gọi hàm hoán vị, a = %d, b = %d\n", *a , *b);      // Sử dụng * để lấy giá trị của biến mà con trỏ a đang trỏ tới và gán cho biến `tmp`     int tmp = *a;      // Sửa giá trị của biến mà con trỏ a đang trỏ tới, bằng giá trị của biến mà con trỏ b đang trỏ tới     *a = *b;      // Sửa giá trị của biến mà con trỏ a đang trỏ tới, bằng giá trị của biến con trỏ a đang trỏ tới, đang được lưu trong `tmp`     *b = tmp;      // Sử dụng * để lấy giá trị của biến mà con trỏ đang trỏ tới     printf("Hàm con, sau khi gọi hàm hoán vị, a = %d, b = %d\n", *a , *b); }  int main() {     int a = 5, b = 7;      printf("Hàm main, trước khi gọi hàm hoán vị, a = %d, b = %d\n", a , b);      // Do tham số của hàm là hai con trỏ, ta cần truyền địa chỉ của biến     // Sử dụng & để lấy địa chỉ của biến     swap(&a, &b);      printf("Hàm main, sau khi gọi hàm hoán vị, a = %d, b = %d\n", a , b);      return 0; }

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

Hàm main, trước khi gọi hàm hoán vị, a = 5, b = 7 Hàm con, trước khi gọi hàm hoán vị, a = 5, b = 7 Hàm con, sau khi gọi hàm hoán vị, a = 7, b = 5 Hàm main, sau khi gọi hàm hoán vị, a = 7, b = 5

Đúng như những gì đã được trình bày trong bài, khi ta có địa chỉ của biến (biểu diễn bằng con trỏ), ta có thể thay đổi giá trị của biến đó. Đó chính là cách truyền con trỏ trong ngôn ngữ C.

Truyền con trỏ vào hàm trong C

Bạn đã quá quen thuộc với việc truyền giá trị vào hàm - truyền tham trị như trong ví dụ ở đầu bài. Chúng ta vừa nắm được cách truyền tham chiếu trong C. Ở phần này, chúng ta sẽ đi xem xét cách truyền con trỏ vào hàm trong ngôn ngữ C.

#include   void addOne(int *ptr) {     // Tăng giá trị của biến mà con trỏ đang trỏ đến lên 1 đơn vị     (*ptr)++; }  int main() {     int *p, i = 10;     p = &i;      addOne(p);      printf("%d", *p); // 11      return 0; }

Trong ví dụ trên, chúng ta truyền con trỏ p vào hàm addOne(). Hàm này có chức năng tăng giá trị của biến mà con trỏ đang trỏ đến lên 1 đơn vị. Khi truyền vào biến con trỏ, giá trị của p trong hàm main() cũng sẽ bị thay đổi.

Theo dõi thông tin về lập trình tại:

  • Forum: https://www.facebook.com/groups/LapTrinhKhongKho/
  • Youtube: https://www.youtube.com/HieuNguyenVanOfficial
1