Truyền con trỏ vào hàm
Thuộc phần Logic và luồng điều khiển trong hành trình C của Coddy. Bài học 26 trên 63.
Giờ bạn đã hiểu những hạn chế của cách truyền tham trị, hãy cùng tìm hiểu cách truyền con trỏ cho hàm giải quyết vấn đề này. Thay vì truyền bản sao giá trị của một biến, bạn có thể truyền địa chỉ bộ nhớ của biến đó cho hàm.
Khi bạn truyền một con trỏ vào hàm, hàm sẽ truy cập được vị trí của biến gốc trong bộ nhớ. Điều này có nghĩa là hàm có thể thao tác trực tiếp với dữ liệu gốc, chứ không chỉ với bản sao.
void processValue(int *ptr) {
// ptr chứa địa chỉ của biến ban đầu
// Giờ hàm (function) có thể truy cập vị trí bộ nhớ đó
}
int main() {
int x = 10;
processValue(&x); // Truyền địa chỉ của x
return 0;
}Hãy chú ý cách chúng ta dùng toán tử lấy địa chỉ (address-of operator) & khi gọi hàm để truyền địa chỉ của biến. Tham số của hàm được khai báo là int *ptr, cho biết hàm mong đợi nhận một con trỏ đến số nguyên. Kỹ thuật cơ bản này mở ra nhiều khả năng mạnh mẽ để các hàm tương tác với dữ liệu trong chương trình của bạn.
Thử thách
DễViết một chương trình C minh họa cách truyền con trỏ vào hàm. Chương trình của bạn cần:
- Tạo một hàm có tên
displayValuenhận một con trỏ đến số nguyên làm tham số - Bên trong hàm
displayValue, dùng toán tử giải tham chiếu để truy cập giá trị tại địa chỉ bộ nhớ và in giá trị đó theo định dạng:Value at address: [value] - Trong hàm
main, khai báo một biến số nguyên có tênnumbervà khởi tạo biến với giá trị 42 - In giá trị ban đầu theo định dạng:
Original value: [value] - Gọi hàm
displayValuevà truyền địa chỉ của biếnnumberbằng toán tử lấy địa chỉ - Sau khi gọi hàm, in thông báo xác nhận:
Function call completed
Đầu ra của bạn cần cho thấy hàm nhận và truy cập thành công địa chỉ bộ nhớ của biến ban đầu:
Original value: 42
Value at address: 42
Function call completedThử thách này giới thiệu khái niệm cơ bản về cách truyền con trỏ vào hàm, cho phép hàm truy cập vị trí bộ nhớ của biến ban đầu thay vì làm việc với một bản sao giá trị của biến đó.
Tự làm thử
#include <stdio.h>
// TODO: Viết hàm (function) displayValue ở đây
int main() {
// TODO: Viết code ở đây
// 1. Khai báo và khởi tạo biến number
// 2. In ra giá trị ban đầu
// 3. Gọi hàm displayValue
// 4. In ra thông báo hoàn tất
return 0;
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Nền tảng về con trỏ
Con trỏ là gì?Khai báo con trỏToán tử lấy địa chỉ (&)Toán tử giải tham chiếu (*)Con trỏ NULLÔn tập: kiến thức cơ bản về con trỏ4Dự án: Công cụ xử lý văn bản đơn giản
Tổng quan dự ánĐếm ký tự2Con trỏ và mảng
Tên mảng dưới dạng con trỏPhần tử mảng và con trỏPhép toán con trỏSo sánh con trỏÔn tập: duyệt mảng bằng con trỏ5Con trỏ và hàm
Truyền theo giá trịTruyền con trỏ vào hàmSửa đổi biến qua con trỏVí dụ kinh điển: hoán đổiTruyền mảng vào hàmÔn tập: đối số con trỏ hàm3Mảng ký tự và chuỗi
Chuỗi dưới dạng mảng charKý tự kết thúc nullNhập chuỗi bằng scanfDùng strlen()Dùng strcpy()Dùng strcat()Dùng strcmp()Ôn tập: các hàm xử lý chuỗi cơ bản6Quản lý bộ nhớ
Bộ nhớ ngăn xếp và bộ nhớ heapCấp phát động với malloc()Dùng sizeof() để cấp phátKiểm tra lỗi cấp phátGiải phóng bộ nhớ với free()Cấp phát với calloc()Ôn tập: Mảng động9Dự án: Nhập thông tin liên hệ đơn giản
Định nghĩa struct ContactHàm tạo liên hệTự luyện tập: Trình biên dịch C online