Trong bài viết này, Lập trình không khó sẽ trình bày về con trỏ và hàm trong C: bao gồm tham chiếu trong C++ và truyền con trỏ vào hàm, để có thể hiểu được bài viết này, các bạn cần nắm rõ kiến thức về con trỏ trong C. Cụ thể, bạn sẽ hiểu được cách truyền địa chỉ làm tham số trong hàm – đó chính là tham chiếu. Mình sẽ luôn có các ví dụ để các bạn hiểu rõ vấn đề nhất.
Mối liên hệ giữa con trỏ và hàm
Trong ngôn ngữ C, bạn hoàn toàn có thể truyền địa chỉ của biến hoặc con trỏ làm tham số của hàm. Để hàm có thể nhận địa chỉ, ta đưa vào các tham số là biến con trỏ. Hãy lấy ví dụ để hiểu rõ vấn đề nhé.
Nếu bạn đang tìm kiếm tham trị và tham chiếu trong C++, xem bài viết này nhé.
Tham chiếu trong C
Lưu ý: Tham chiếu là khái niệm chỉ có trong C++. Với C, cách tương tự để truyền tham chiếu là sử dụng truyền con trỏ. Với tham trị (truyền giá trị) thì C và C++ là giống nhau.
Chúng ta hãy cùng thử viết 1 hàm hoán vị 2 số nguyên nhé.
#include <stdio.h> void swap(int a, int b){ printf("Ham con, truoc khi goi ham hoan vi, a = %d, b = %dn", a , b); int tmp = a; a = b; b = tmp; printf("Ham con, sau khi goi ham hoan vi, a = %d, b = %dn", a , b); } int main(){ int a = 5, b = 7; printf("Ham main, truoc khi goi ham hoan vi, a = %d, b = %dn", a , b); swap(a, b); printf("Ham main, sau khi goi ham hoan vi, a = %d, b = %dn", a , b); }
Kết quả chạy:
Ham main, truoc khi goi ham hoan vi, a = 5, b = 7 Ham con, truoc khi goi ham hoan vi, a = 5, b = 7 Ham con, sau khi goi ham hoan vi, a = 7, b = 5 Ham main, sau khi goi ham hoan vi, 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()
. Đó là bởi hàm của bạn đang truyền bởi tham trị – nghĩa là khi hàm swap()
được gọi thì 2 tham số đó sẽ được hàm này sao chép sang 2 vùng nhớ mới, mọi thay đổi được thực hiện trên bản sao này.
Bây giờ, ta hãy thử truyền con trỏ như sau:
#include <stdio.h> // Tham số đầu vào là 2 biến con trỏ kiểu int void swap(int *a, int *b){ // dùng * để lấy giá trị của biến mà con trỏ đang trỏ tới printf("Ham con, truoc khi goi ham hoan vi, a = %d, b = %dn", *a , *b); // 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 của biến con trỏ a đang trỏ tới, đang được lưu trong `tmp` *b = tmp; // dùng * để lấy giá trị của biến mà con trỏ đang trỏ tới printf("Ham con, sau khi goi ham hoan vi, a = %d, b = %dn", *a , *b); } int main(){ int a = 5, b = 7; printf("Ham main, truoc khi goi ham hoan vi, a = %d, b = %dn", a , b); // Do tham số hàm là 2 con trỏ, ta cần truyền vào địa chỉ // Dùng & để lấy địa chỉ của biến. swap(&a, &b); printf("Ham main, sau khi goi ham hoan vi, a = %d, b = %dn", a , b); }
Kết quả chạy:
Ham main, truoc khi goi ham hoan vi, a = 5, b = 7 Ham con, truoc khi goi ham hoan vi, a = 5, b = 7 Ham con, sau khi goi ham hoan vi, a = 7, b = 5 Ham main, sau khi goi ham hoan vi, a = 7, b = 5
Đúng như những gì đã trình bày rõ ràng trong bài con trỏ, khi ta có địa chỉ của biến (con trỏ lưu) thì ta có thể thay đổi giá trị của biến mà con trỏ đang trỏ tới. Đó chính là cách truyền con trỏ trong 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ư đoạn code đầu tiên của bài. Chúng ta cũng vừa nắm được cách truyền tham chiếu trong C. Ở phần này, bạn sẽ cùng tôi đi xem xét cách truyền con trỏ vào hàm trong C như thế nào.
#include <stdio.h> void addOne(int *ptr) { // Tăng giá trị của biến nơi 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 nơi con trỏ đang trỏ tới. Vì ta truyền vào biến con trỏ nên 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:
Trả lời