Xem thêm

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

Huy Erick
Trong bài viết này, chúng ta sẽ tìm hiểu về con trỏ và hàm trong ngôn ngữ lập trình C. Các sử dụng như truyền con trỏ vào hàm và tham chiếu trong C++ sẽ...

Trong bài viết này, chúng ta sẽ tìm hiểu về con trỏ và hàm trong lập trình c' class='hover-show-link replace-link-1748'>ngôn ngữ lập trình c . Các sử dụng như truyền con trỏ vào hàm và tham chiếu trong c+ + sẽ được giải thích chi tiết. Để hiểu rõ nội dung bài viết, chúng ta cần có kiến thức cơ bản về con trỏ trong C. Bài viết sẽ cung cấp các ví dụ để giúp bạn hiểu một cách hoàn toàn.

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

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

Tham Chiếu Và Tham Trị Hình ảnh mô phỏng tham chiếu (pass by reference) trong C++ và tham trị (pass by value) trong C/C++. Trong đó cup là một biến được truyền vào lời gọi hàm fillCup(). Khi truyền theo tham chiếu thì hàm có khả năng thay đổi giá trị của tham số của hàm; Còn truyền theo tham trị thì hàm không thể thay đổi giá trị của tham số. Nguồn ảnh: mathwarehouse

Nếu bạn quan tâm đến tham trị và tham chiếu trong C++, hãy xem bài viết chi tiết về chủ đề này.

Tham chiếu trong C

Lưu ý: Tham chiếu là khái niệm chỉ tồn tại trong C++. Trong C, ta sử dụng truyền con trỏ để đạt được tương tự. Tham trị (truyền giá trị) thì giống nhau trong cả c và c++ .

Chúng ta hãy cùng viết một hàm hoán vị hai số nguyên nhé.

#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); }

Kết quả khi chạy:

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, hàm con không thay đổi giá trị của biến a và b trong hàm main(). Điều này xảy ra vì khi gọi hàm swap(), giá trị của hai tham số được sao chép vào hai vùng nhớ mới, mọi thay đổi chỉ ảnh hưởng đến bản sao này.

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

#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);     // Do tham số của hàm là hai con trỏ, ta cần truyền vào địa chỉ.     // 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); }

Kết quả khi chạy:

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 viết, khi ta có địa chỉ của biến (biến con trỏ), ta có thể thay đổi giá trị của biến mà con trỏ đang trỏ tới. Đó là cách truyền con trỏ trong ngôn ngữ C.

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

Bạn đã quen thuộc với việc truyền giá trị vào hàm - truyền tham trị như đoạn code đầu tiên của bài viết. Bây giờ, hãy cùng xem 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. Vì ta 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 Lập trình không khó tại:

1