Con trỏ & Hằng trong C++
Khóa học lập trình C++ căn bản
Danh sách bài học
Con trỏ & Hằng trong C++
Dẫn nhập
Ở bài học trước, bạn đã nắm được cách CẤP PHÁT MẢNG ĐỘNG (Dynamically allocating arrays). Với kỹ thuật này, bạn có thể sử dụng mảng với số lượng phần tử lớn hơn và có thể thay đổi trong quá trình chạy chương trình.
Hôm nay, chúng ta sẽ cùng tìm hiểu về Con trỏ và Hằng (Pointers and const) trong C++.
Nội dung
Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về:
- CON TRỎ TRONG C++ (Pointer)
- CẤP PHÁT ĐỘNG TRONG C++ (Dynamic memory allocation)
Trong bài ta sẽ cùng tìm hiểu các vấn đề:
- Con trỏ hằng (Pointer to const value)
- Hằng con trỏ (Const pointers)
- Hằng con trỏ hằng (Const pointer to a const value)
Con trỏ hằng (Pointer to const value)
Ở thời điểm này, có thể bạn đã quen thuộc với đoạn code bên dưới:
int value = 10;
int *ptr = &value;
*ptr = 20; // gán biến value = 20
Đoạn code trên hoạt động một cách bình thường. Tuy nhiên, nếu value là một hằng, chương trình sẽ gây ra lỗi:
const int value = 10;
int *ptr = &value; // lỗi biên dịch: cannot convert from 'const int *' to 'int *'
Trong ví dụ trên, value lúc này là một hằng, nghĩa là giá trị của hằng value sẽ không thể thay đổi trong suốt vòng đời của chương trình. Vì vậy, việc gán một biến con trỏ cho một hằng sẽ gây ra lỗi biên dịch.
Chú ý: Thông thường, khi nói một biến con trỏ (hoặc con trỏ), điều đó nghĩa là một con trỏ trỏ đến một biến.
Để dùng con trỏ trỏ đến một hằng, C++ cung cấp cho chúng ta khái niệm con trỏ hằng (Pointer to const value).
Con trỏ hằng (Pointer to const value) là con trỏ trỏ đến vùng dữ liệu hằng. Ta không thể thay đổi giá trị mà nó đang trỏ đến. Nhưng có thể cho nó trỏ đến một địa chỉ vùng nhớ khác.
const int value = 10;
const int *ptr = &value; // ptr là con trỏ hằng
*ptr = 20; // lỗi biên dịch: you cannot assign to a variable that is const
Mặt khác, con trỏ hằng có thể trỏ đến một biến:
int value = 10;
const int *ptr = &value; // ptr là con trỏ hằng
Chú ý: Con trỏ hằng xử lý giá trị tại địa chỉ mà nó trỏ tới là hằng khi được truy cập thông qua con trỏ, bất kể biến ban đầu được định nghĩa là hằng hay không.
int value = 10;
const int *ptr = &value; // ptr là con trỏ hằng
value = 20; // ok
*ptr = 20; // lỗi, vì ptr là con trỏ hằng
Vì con trỏ hằng là con trỏ trỏ đến vùng dữ liệu hằng (không phải hằng con trỏ), nên nó có thể trỏ đến một địa chỉ vùng nhớ khác:
int value1 = 5;
const int *ptr = &value1; // ptr là con trỏ hằng
int value2 = 6;
ptr = &value2; // con trỏ hằng có thể trỏ đến địa chỉ khác
Hằng con trỏ (Const pointers)
Ngược lại với con trỏ hằng, hằng con trỏ (const pointers) là con trỏ không thể thay đổi được địa chỉ vùng nhớ mà nó lưu trữ, nhưng có thể thay đổi được giá trị mà nó trỏ đến.
int value = 10;
int *const ptr = &value;
Chú ý: Như một hằng thông thường, con trỏ hằng phải được khởi tạo khi khai báo, và địa chỉ được gán cho con trỏ hằng sẽ không thể thay đổi về sau.
int value1 = 10;
int value2 = 20;
int *const ptr = &value1; // ptr là hằng con trỏ
ptr = &value2; // lỗi biên dịch, địa chỉ hằng con trỏ trỏ đến không thể thay đổi
Tuy nhiên, vì biến value được ptr trỏ đến không phải hằng, nên hằng con trỏ ptr có thể thay đổi giá trị biến value:
int value = 10;
int *const ptr = &value; // ptr không thể thay đổi địa chỉ vùng nhớ nó lưu trữ
*ptr = 20; // nhưng ptr có thể thay đổi giá trị vùng nhớ nó trỏ đến
Hằng con trỏ hằng (Const pointer to a const value)
Khi kết hợp giữa hằng con trỏ và con trỏ hằng với nhau, ta có thể có một con trỏ vừa không thay đổi được địa chỉ vùng nhớ mà nó lưu trữ, vừa không thay đổi được giá trị của vùng nhớ đó.
Để sử dụng hằng con trỏ hằng, ta sử dụng 2 từ khóa const như sau:
int value = 10;
const int *const ptr = &value;
Chú ý: Một hằng con trỏ hằng không thể trỏ đến một địa chỉ khác, cũng như giá trị mà nó trỏ đến sẽ không thể thay đổi thông qua con trỏ.
Kết luận
Qua bài học này, bạn đã nắm được các khái niệm liên quan đến Con trỏ và Hằng (Pointers and const) trong C++. Ba từ khóa con trỏ hằng, hằng con trỏ và hằng con trỏ hằng tương đối dễ nhầm lẫn khi khai báo và sử dụng, mình tin bài học này đã giúp bạn hiểu rõ hơn về nó.
Con trỏ hằng thường được sử dụng chủ yếu trong các tham số hàm (hàm hoặc đối số có mục đích read-only) để giúp đảm bảo hàm không vô tình thay đổi đối số được truyền vào trong hàm.
Trong bài tiếp theo, mình sẽ giới thiệu cho các bạn khái niệm BIẾN THAM CHIẾU TRONG C++ (Reference variables).
Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.
Tải xuống
Tài liệu
Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Con trỏ & Hằng trong C++ dưới dạng file PDF trong link bên dưới.
Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com
Đừng quên like và share để ủng hộ Kteam và tác giả nhé!
Thảo luận
Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.
Nội dung bài viết
Tác giả/Dịch giả
Khóa học
Khóa học lập trình C++ căn bản
Hiện nay, C++ đã là cái tên rất quen thuộc trong ngành lập trình. Mặc dù C++ là ngôn ngữ lập trình đã ra đời khá lâu, nhưng không phải ai cũng có cơ hội để tìm hiểu về nó.
Vì vậy, Kteam đã xây dựng lên khóa học LẬP TRÌNH C++ CĂN BẢN để cung cấp một lượng kiến thức về ngôn ngữ C++ nói riêng, và các khái niệm khác trong lập trình nói chung.
Nội dung khóa học sẽ được phân tách một cách chi tiết, nhằm giúp các bạn dễ hiểu và thực hành được ngay. Serial dành cho những bạn chưa có bất kỳ kiến thức gì về lập trình, hoặc những bạn mất căn bản muốn lấy lại kiến thức nền tảng lập trình, cụ thể là C++.
anh giảng bài này nói hay quá, nghe cách nói chuyện đáng yêu ghê, tạo cảm hứng học lắm luôn ý hihi. Em nay năm nay là sv năm 2 cntt rồi mà bị mất gốc do năm nhất lơ ngơ học nguồn tùm lum à, nhưng may mắn giờ đã tìm được Howkteam rồi ^^
anh ơi không có link download tài liệu bài 48,49 hả anh???
Ra video team ơi e hóng dài cổ rồi, video trình bày rất hay chứ đọc tài liệu nản quả!
Chúc team ngày càng phát triển để những men ko có điều kiện có thể học ké hehe