Con trỏ (Pointer)
Trong C, *p đại diện cho giá trị tại địa chỉ con trỏ, p là địa chỉ của giá trị đó.
const char* và char const*: con trỏ trỏ đến char hằng (constant char), giá trị char không thể thay đổi qua con trỏ này. Nhưng con trỏ p có thể trỏ đến char hằng khác.
char* const: con trỏ hằng trỏ đến char, giá trị char có thể thay đổi, nhưng con trỏ không thể trỏ sang địa chỉ khác.
const char* const: con trỏ hằng trỏ đến char hằng. Cả con trỏ và giá trị đều không thể thay đổi.
Quy tắc nhớ: Đọc cú pháp từ phải sang trái.
// con trỏ hằng trỏ đến char hằng const char * const // con trỏ hằng trỏ đến char char * const // con trỏ trỏ đến char hằng const char *
Ví dụ (C)
Bỏ comment các dòng lỗi để xem lỗi biên dịch.
#include <stdio.h>
int main() {
// Ví dụ: char const* (tương đương const char*)
const char p = 'A';
char const* q = &p; // q trỏ đến char hằng
// *q = 'B'; // LỖI: assignment of read-only location '*q'
const char r = 'C';
q = &r; // OK: q có thể trỏ đến char hằng khác
printf("%c\n", *q);
// Ví dụ: char* const
char u = 'D';
char* const t = &u; // t là con trỏ hằng
*t = 'E'; // OK: thay đổi giá trị
printf("%c", *t);
// t = &r; // LỖI: assignment of read-only variable 't'
// Ví dụ: const char* const
char const* const s = &p;
// *s = 'D'; // LỖI: không thay đổi được giá trị
// s = &r; // LỖI: không thay đổi được con trỏ
return 0;
}
Kết quả đầu ra
C E