1. const trong ngôn ngữ C là gì?
Khi lập trình với ngôn ngữ C, từ khóa const
rất hữu ích để ngăn việc giá trị của biến bị thay đổi nhầm lẫn. const
được dùng để khai báo rằng “giá trị của biến này sẽ không được thay đổi!” – nghĩa là sau khi đã gán giá trị ban đầu, bạn không thể thay đổi nó nữa.
Ví dụ, hãy xem đoạn mã sau:
const int x = 10;
x = 20; // Báo lỗi!
Bằng cách sử dụng const
như trên, giá trị của x
được cố định và sẽ không bị thay đổi nhầm. Việc này giúp đảm bảo tính ổn định cho toàn bộ chương trình bằng cách “ngăn” biến không được tự ý thay đổi.
2. Tại sao nên dùng const?
2.1 Tăng tính an toàn cho mã nguồn
Khi dùng const
, bạn giảm nguy cơ những biến hoặc dữ liệu quan trọng bị thay đổi ngoài ý muốn. Ví dụ, nếu thay đổi nhầm giá trị cấu hình hoặc hằng số quan trọng, chương trình có thể hoạt động không ổn định. const
giúp ngăn điều đó xảy ra.
2.2 Tận dụng tối ưu hóa của trình biên dịch
Khi bạn khai báo một giá trị là const
, trình biên dịch sẽ biết rằng giá trị này không đổi và có thể tối ưu hóa hiệu suất. Đặc biệt, các biến const
thường được lưu trong bộ nhớ cache, giúp tăng tốc độ nếu được sử dụng nhiều lần.
2.3 Cải thiện khả năng đọc và làm việc nhóm
Dùng const
là một thực tiễn tốt giúp mã nguồn dễ đọc hơn. Đặc biệt khi làm việc nhóm, const
thể hiện rõ ý định “giá trị này không thay đổi”, giúp tránh việc thành viên khác chỉnh sửa nhầm biến quan trọng.

3. Con trỏ và const: Hiểu đúng mối quan hệ
Mối quan hệ giữa con trỏ và const
là một điểm dễ gây nhầm lẫn khi học C. Tùy vào vị trí đặt const
, bạn sẽ thay đổi được hành vi của con trỏ hoặc giá trị mà con trỏ trỏ tới.
const int *p;
Trường hợp này, giá trị màp
trỏ tới (*p
) không thể thay đổi, nhưng chínhp
– tức là địa chỉ mà con trỏ trỏ tới – vẫn có thể thay đổi.int *const p;
Ở đây, bản thân con trỏp
không thể thay đổi địa chỉ, nhưng giá trị màp
trỏ tới (*p
) vẫn có thể thay đổi.const int *const p;
Trong trường hợp này, cả con trỏp
và giá trị mà nó trỏ tới đều không thể thay đổi. Đây là trạng thái “bất biến hoàn toàn”.
Con trỏ rất mạnh mẽ, nhưng nếu dùng sai dễ gây ra lỗi, hãy cẩn thận với vị trí đặt const
.
4. Ví dụ thực tế về sử dụng const
4.1 Dùng const cho tham số hàm
Khi truyền mảng hoặc con trỏ vào hàm, nếu không muốn hàm đó thay đổi dữ liệu gốc, hãy dùng const
. Ví dụ dưới đây dùng const
để đảm bảo nội dung mảng không bị thay đổi trong hàm.
void printArray(const int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("
");
}
Nhờ vậy, dữ liệu của mảng được truy cập an toàn.
4.2 Dùng const cho bảng tra cứu (lookup table)
Với dữ liệu không cần thay đổi trong quá trình chạy chương trình, như bảng tra cứu, bạn nên dùng const
. Ví dụ sau là bảng chuỗi ký tự đại diện cho các ngày trong tuần.
const char *days[] = {"Monday", "Tuesday", "Wednesday"};
Nhờ đó, dữ liệu sẽ không bị thay đổi nhầm trong quá trình sử dụng trong chương trình.

5. Lỗi thường gặp và lưu ý khi dùng const
5.1 Ví dụ lỗi khi dùng const
Nếu dùng const
sai cách, có thể gây ra lỗi không mong muốn. Hãy xem ví dụ sau:
void modifyArray(const int arr[], int size) {
arr[0] = 10; // Lỗi biên dịch!
}
Trong hàm này, cố gắng thay đổi phần tử của mảng arr
(đã có const
) sẽ làm trình biên dịch báo lỗi. const
có nghĩa là “không thay đổi được”, nếu cố thay đổi sẽ bị lỗi.
5.2 Lưu ý khi dùng const với ép kiểu (cast)
Có thể sử dụng const_cast
để loại bỏ const
khỏi biến, nhưng thao tác này tiềm ẩn nhiều rủi ro. Đặc biệt, nếu phụ thuộc vào hệ thống hoặc dẫn đến hành vi không xác định, bạn nên tránh sử dụng. Hãy tôn trọng ý nghĩa của const
để đảm bảo mã nguồn an toàn.
6. Kết luận
const
trong ngôn ngữ C là công cụ quan trọng giúp tăng độ an toàn và tối ưu hiệu năng cho mã nguồn. Dùng const
đúng cách cho biến và con trỏ sẽ giúp chương trình ổn định, tránh nhiều lỗi khó tìm.
Khi lập trình tiếp theo, hãy tích cực sử dụng const
để viết mã tốt hơn. Bạn có thể sẽ bất ngờ nhận ra: “Ồ, chỗ này cũng nên dùng const
nữa!”