Trong bài viết này, chúng ta sẽ đến với 2 khái niệm khó nhớ và hay gây nhầm lẫn là: hằng con trỏ và con trỏ hằng.
1. Hằng con trỏ – Constant pointer
Khai báo:
<Kiểu dữ liệu> * const <Tên con trỏ> = <Địa chỉ khởi tạo> ;
Đặc điểm:
– Cần gán ngay giá trị địa chỉ khởi tạo cho hằng con trỏ tại câu lệnh khai báo ban đầu.
– Không thể thay đổi địa chỉ đã được khởi gán cho hằng con trỏ ( sẽ gây ra lỗi).
– Có thể thay đổi giá trị tại địa chỉ đã khởi gián ban đầu.
Ví dụ 1:
#include "stdio.h" #include "conio.h" void main() { int* const p; // error }
Chương trình dịch sẽ thông báo lỗi vì hằng con trỏ p không khởi tạo giá trị khi khai báo.
Ví dụ 2:
#include "stdio.h" #include "conio.h" void main() { int m = 2; int* const p = &m; p++; // error }
Chương trình dịch sẽ thông báo lỗi vì hằng con trỏ không thể thay đổi địa chỉ trỏ tới.
Ví dụ 3:
#include "stdio.h" #include "conio.h" void main() { int m = 2; int* const p = &m; printf("\n*p = %d", *p); m++; printf("\n*p = %d", *p); getch(); }
Câu lệnh m++ chỉ làm thay đổi giá trị tại địa chỉ &m.
2. Con trỏ hằng – Pointer to constant
Khai báo:
const <Kiểu dữ liệu> * <Tên con trỏ>;
Đặc điểm:
– Không được phép dùng trực tiếp con trỏ hằng để thay đổi giá trị tại vùng nhớ mà con trỏ hằng đang trỏ đến.
– Con trỏ hằng có thể thể thay đổi địa chỉ trỏ tới (hay nói cách khác: nó có thể trỏ đến các ô nhớ khác nhau).
Ví dụ 4:
#include "stdio.h" #include "conio.h" void main() { int m = 3; const int* p; p = &m; m++; (*p)++; // error }
Câu lệnh m++ hoàn toàn hợp lệ, còn câu lệnh (*p)++ gây ra lỗi thay đổi giá trị tại vùng nhớ.
Ví dụ 5:
#include "stdio.h" #include "conio.h" void main() { int m = 3, n = 5; const int* p; p = &m; printf("\n*p = %d", *p); p = &n; printf("\n*p = %d", *p); getch(); }
Leave a Reply
You must be logged in to post a comment.