Con trỏ số học trong C++
Con trỏ số học là gì? Nó hoạt động như thế nào? Nó khác gì với con trỏ bình thường? Để trả lời cho những câu hỏi trên, mời bạn đọc cùng eLib.VN tham khảo bài viết về con trỏ số học trong C++ dưới đây.
Mục lục nội dung
1. Con trỏ số học là gì?
Như đã giải thích trong bài trước, con trỏ trong C++ là một địa chỉ ô nhớ. Vì thế, bạn có thể thực hiện các hoạt động số học trên một con trỏ như khi bạn thực hiện với giá trị số. Có 4 toán tử số học mà có thể được sử dụng trên các con trỏ: ++, --, +, và -.
Để hiểu về con trỏ số học trong C++, chúng ta giả sử rằng biến contro là một con trỏ nguyên mà trỏ tới địa chỉ 1000. Giả sử số nguyên là 32 bit, chúng ta thực hiện thao tác số học trên con trỏ này:
contro++;
Bây giờ, sau thao tác trên, contro sẽ trỏ tới vị trí 1004 bởi vì mỗi lần contro được tăng thêm một, nó sẽ trỏ tới vị trí integer kế tiếp, nghĩa là tăng lên 4 byte kế tiếp so với vị trí hiện tại. Thao tác này sẽ di chuyển con trỏ tới vị trí bộ nhớ tiếp theo mà không ảnh hưởng tới giá trị thực sự tại vị trí bộ nhớ. Nếu contro trỏ tới một ký tự mà địa chỉ của nó là 1000, thì khi đó thao tác trên sẽ trỏ tới vị trí 1001 bởi vì ký tự tới sẽ ở vị trí 1001.
2. Tăng con trỏ trong C++
Chúng ta ưa thích sử dụng một con trỏ trong chương trình thay vì sử dụng một mảng bởi vì con trỏ biến có thể tăng, không giống như tên mảng, không thể tăng được, bởi vì nó là một con trỏ hằng số. Chương trình sau tăng con trỏ biến để truy cập tới mỗi phần tử của mảng:
#include <iostream>
using namespace std;
const int MAX = 3;
int main() {
int arr[MAX] = {10, 20, 30};
int *contro;
// contro tro toi mang
contro = arr; // arr dai dien cho gia tri dau tien cua mang arr
for (int i = 0; i < MAX; i++) {
cout << "Dia chi cua arr[" << i << "] = ";
cout << contro << endl;
cout << "Gia tri cua arr[" << i << "] = ";
cout << *contro << endl;
// tro toi vi tri tiep theo
contro++;
}
return 0;
}
Như bạn đã biết các phần tử của mảng trong C++ được lưu trong các vùng nhớ liên tiếp. Nên khi tăng con trỏ lên một đơn vị tức là con trỏ sẽ trỏ đến địa chỉ lưu phần tử tiếp theo của mảng.
Kết quả:
Dia chi cua arr[0] = 0x6ffe30
Gia tri cua arr[0] = 10
Dia chi cua arr[1] = 0x6ffe34
Gia tri cua arr[1] = 20
Dia chi cua arr[2] = 0x6ffe38
Gia tri cua arr[2] = 30
3. Giảm con trỏ trong C++
Ví dụ giảm con trỏ trong C++, giá trị của nó sẽ sẽ được giảm theo số các byte của kiểu dữ liệu như sau:
#include <iostream>
using namespace std;
const int MAX = 3;
int main() {
int arr[MAX] = {10, 20, 30};
int *contro;
// contro tro toi dia chi cuoi cung cua mang arr
contro = &arr[MAX - 1];
for (int i = MAX-1; i >= 0; i--) {
cout << "Dia chi cua arr[" << i << "] = ";
cout << contro << endl;
cout << "Gia tri cua arr[" << i << "] = ";
cout << *contro << endl;
// tro toi vi tri truoc
contro--;
}
return 0;
}
Kết quả:
Dia chi cua arr[2] = 0x6ffe38
Gia tri cua arr[2] = 30
Dia chi cua arr[1] = 0x6ffe34
Gia tri cua arr[1] = 20
Dia chi cua arr[0] = 0x6ffe30
Gia tri cua arr[0] = 10
4. So sánh con trỏ trong C++
Các con trỏ có thể được so sánh bởi sử dụng các toán tử quan hệ, như ==, <, và >. Nếu p1 và p2 trỏ tới các biến mà có liên quan với nhau, như các phần tử của cùng một mảng, thì khi đó, p1 và p2 có thể được so sánh với nhau một cách có ý nghĩa.
Chương trình sau chỉnh sửa ví dụ trước bởi tăng con trỏ biến để mà địa chỉ mà nó trỏ tới nhỏ hơn hoặc bằng địa chỉ của phần tử cuối cùng của mảng, là &var[MAX - 1]:
#include <iostream>
using namespace std;
const int MAX = 3;
int main() {
int arr[MAX] = {10, 100, 200};
int *contro;
// tro contro toi vi tri dau tien cua mang arr
contro = arr;
int i = 0;
while ( contro <= &arr[MAX - 1] ) {
cout << "Dia chi cua arr[" << i << "] = ";
cout << contro << endl;
cout << "Dia chi cua arr[" << i << "] = ";
cout << *contro << endl;
// tro toi vi tri o truoc
contro++;
i++;
}
return 0;
}
Dia chi cua arr[0] = 0x6ffe30
Dia chi cua arr[0] = 10
Dia chi cua arr[1] = 0x6ffe34
Dia chi cua arr[1] = 100
Dia chi cua arr[2] = 0x6ffe38
Dia chi cua arr[2] = 200
Trên đây là bài viết của eLib.VN về con trỏ số học trong C++. Hy vọng qua bài này bạn sẽ hiểu và vận dụng trong quá trình học tập và làm việc với C++. Chúc các bạn thành công!
Tham khảo thêm
- doc Con trỏ trong C++
- doc Con trỏ NULL trong C++
- doc Con trỏ và mảng trong C++
- doc Mảng con trỏ trong C++
- doc Con trỏ tới con trỏ & truyền con trỏ tới hàm trong C++
- doc Trả về con trỏ từ hàm trong C++