Sửa đổi biến qua con trỏ
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 27 trên 63.
Giờ đây, bạn có thể tận dụng sức mạnh thực sự của con trỏ: thay đổi biến gốc thông qua một hàm. Khi truyền con trỏ cho một hàm, hàm có thể dùng toán tử giải tham chiếu để thay đổi giá trị được lưu tại địa chỉ bộ nhớ đó.
Bên trong hàm, bạn giải tham chiếu con trỏ bằng toán tử * để truy cập và thay đổi giá trị của biến ban đầu. Kỹ thuật này được gọi là truyền tham chiếu vì bạn truyền tham chiếu đến vị trí của biến trong bộ nhớ.
void doubleValue(int *ptr) {
*ptr = *ptr * 2; // Giải tham chiếu để thay đổi giá trị ban đầu
}
int main() {
int x = 5;
doubleValue(&x); // Truyền địa chỉ của x
// x giờ là 10!
return 0;
}Mấu chốt là dùng *ptr ở vế trái của phép gán để thay đổi giá trị tại địa chỉ bộ nhớ mà con trỏ lưu giữ. Nhờ vậy, các hàm có thể thay đổi vĩnh viễn các biến từ hàm gọi, mở ra những khả năng lập trình mạnh mẽ mà cách truyền đối số theo giá trị đơn thuần không thể mang lại.
Thử thách
DễViết chương trình C minh họa cách thay đổi biến thông qua con trỏ (pointer) bằng cách tạo một hàm (function) nhân giá trị của một số nguyên (integer) với 3.
Chương trình của bạn cần:
- Tạo hàm có tên
tripleValue, nhận con trỏ đến một số nguyên làm tham số - Bên trong hàm
tripleValue, dùng toán tử giải tham chiếu để nhân giá trị tại địa chỉ bộ nhớ với 3 - Bên trong hàm
tripleValue, in giá trị mới theo định dạng:Value tripled to: [value] - Trong hàm
main, khai báo biến số nguyên có tênnumbervà khởi tạo biến với giá trị 8 - In giá trị ban đầu theo định dạng:
Original value: [value] - Gọi hàm
tripleValuevà truyền địa chỉ của biếnnumberbằng toán tử lấy địa chỉ - Sau khi gọi hàm, in giá trị cuối cùng của
numbertheo định dạng:Final value: [value]
Đầu ra của bạn cần cho thấy hàm thay đổi thành công biến ban đầu thông qua con trỏ:
Original value: 8
Value tripled to: 24
Final value: 24Thử thách này minh họa sức mạnh của cách truyền tham chiếu bằng con trỏ. Hàm có thể thay đổi vĩnh viễn biến ban đầu bằng cách giải tham chiếu con trỏ và thay đổi giá trị tại vị trí bộ nhớ đó.
Tự làm thử
#include <stdio.h>
// TODO: Viết hàm tripleValue tại đây
int main() {
// TODO: Viết code tại đây
// Khai báo và khởi tạo biến number
// In ra giá trị ban đầu
// Gọi hàm tripleValue
// In ra giá trị cuối cùng
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