C++ Nâng Cao. Hằng Con trỏ và Con Trỏ Hằng

 

Chào mừng các bạn đến với blog: Phát Triển Phần Mềm 123AZ.

Chủ đề học lập trình c++ nâng cao.

Trong bài này. Chúng ta sẽ tìm hiểu về con trỏ hằng và hằng con trỏ trong c++

1. Con Trỏ Hằng Trong Lập Trình C++

Ví dụ:

[code language=”cpp”]
const int* p = NULL;
const int a = 5;
p = &a;
int b = 8;
p = &b;
[/code]

con trỏ có thể trỏ vào các biến int a, int b hoặc thay đổi vùng nhớ nó trỏ đến.

Nhưng nó ko cho phép thay đổi giá trị nó trỏ đến.

Ví dụ chúng ta viết:

*p = 8;   => Chương trình sẽ báo lỗi.

 

2. Hằng Con Trỏ Trong Lập Trình C++

Trái ngược lại so với con trỏ hằng. Khi chúng ta khai báo như sau:

[code language=”cpp”]

int b = 5;
int c = 8;
int* const pp = &b;
*pp = 0;
*pp = 1;

[/code]

 

pp được coi là 1 hằng con trỏ.

Nếu pp được cấp phát 1 vùng nhớ hay được gán cho một vùng nhớ lúc khởi tạo. Thì nó sẽ chỉ trỏ vào vùng nhớ đó.

Hằng con trỏ không cho phép nó trỏ sang vùng nhớ khác, nhưng cho phép nó thay đổi giá trị đang trỏ.

Nghĩa là *pp = 0 thì hợp lệ.

Nhưng gán pp = &c thì ko cho phép.

Về cơ bản hằng con trỏ ít được sử dung. Nhưng con trỏ hằng thường được sử dụng nhiều.

Con trỏ hằng thường được sử dụng để khai báo các biến đầu vào của một hàm.

Chúng ta cùng xem ví dụ sau:

int CalSum(int* val1, int* val2)   // Case 1
{
}
Thông thường khi xây dựng hàm, chúng ta thường sử dụng kiểu truyền tham chiếu và tham trỏ cho đối số của hàm.
Nghĩa là val1 và val2 khi vào trong hàm sẽ ko bị copy ra một bản sao để xử lý nội bộ bên trong.
Tuy nhiên khi dùng như thế này thì val1 có thể bị thay đổi giá trị khi ra khỏi hàm.
Ví dụ ban đầu val1 = 5. Vào bên trong chúng xử lý gán hay sét một giá trị mới cho val1 ví dụ là 6. Thì sau khi ra ngoài val1 sẽ có giá trị là 6.
Điều này nhiều vô tình gây ra những lỗi không mong muốn trong dự án.
Để hạn chế việc làm thay đổi giá trị của val1 mà vẫn dùng kỹ thuật tham trỏ như ví dụ trên.
Người ta sẽ sử dụng thêm const ở trước biến.
Như vậy tôi có.
int CalSum(const int& val1, const int& val2)  // Case 2
{
}
Kỹ thuật này giải quyết hai vấn đề.
+ Là vấn để như tôi giải thích ở trên.
+ Vấn đề thứ 2 đó là:
Có nhiều khi một hàm cần lấy ra nhiều kết quả trả về.
Do đó chỉ return thôi là chưa đủ, mà người ta còn dùng các biến đầu vào như là các biến đầu ra.
=> Nếu muốn khai báo biến đầu vào như một biến trả ra thì dùng như trường hợp case 1.
Nghĩa là ko dùng constant mà chỉ dùng thuần là tham trỏ hoặc tham chiếu.
Dùng const là cách để phân biệt, biến đối số này là biến đầu vào của hàm ko phải biến trả ra kết quả.
Ok. Đó là lý thuyết về con trỏ hằng và hằng con trỏ trong c++. Các bạn hãy nắm thật chắc để tránh sự nhầm lẫn khi sử dụng
Pass Pham

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.