Phép toán trên con trỏ

Một phần của tài liệu Lý thuyết lập trình C++ (Trang 65 - 67)

- from alpha to omega 4 Trả về giá trị của hàm (returning value from functions)

5.Phép toán trên con trỏ

Các phép toán hợp lệ được sử dụng trên con trỏ bao gồm • Cộng/trừ con trỏ với một số nguyên: pa=pb+5; • Trừ hai con trỏ cùng kiểu cho nhau: x=pa-pb; • Tăng giảm con trỏ lên một đơn vị: pa++; pb-- • So sánh hai con trỏ: ==, !=, >, <, >=, <=

a. Các phép toán số học trên con trỏ: +, -, ++, --

Khi cộng/trừ một con trỏ với một số nguyên, thì con trỏ sẽ “dịch” đi một đoạn “tương ứng” (không có nghĩa là bằng nhé, chỉ “tương ứng” thôi) với số nguyên đó. Xét đoạn chương trình sau.

C++ Code:

Lựa chọn code | Ẩn/Hiện code

#include <iostream> using namespace std; int main(){ int a[10]; int* pa=a;

cout << "Before: " << (void*)pa << endl; // in địa chỉ pa trước khi dịch chuyển

pa=pa+5; // dịch pa đi 5 đơn vị

cout << "After: " << (void*)pa << endl; // địa chi pa sau khi dịch chuyển return 0; } Kết quả mình test là: Trích dẫn: Before: 0x22ff10 After: 0x22ff24

Nghĩa là nó pa đã dịch đi một đoạn là 14 ứng với số hexa hay 20 với decimal, tức là dịch qua 5 vùng nhớ kiểu int (vì mỗi biến int rộng 4 bytes). Từ ví dụ trên ta thấy khoảng dịch của con trỏ phụ thuộc vào kiểu mà nó trỏ tới. pa=pa+5 không có nghĩa là nó dịch đi 5 bytes mà nó dịch đi một đoạn ứng với 5 đối tượng có kiểu int (tức 20 bytes). Tương tự cho phép toán ++ và --. Các bạn có thể viết chương trình và test thử.

C++ không cho phép cộng hai con trỏ cho nhau, nhưng trừ hai con trỏ cho nhau thì hoàn toàn hợp lệ. Tuy nhiên phép trừ hai con trỏ “chẳng liên quan gì đến nhau” là một phép trừ vô nghĩa, mặc dù C++ không cấm điều này. Thông thường ta chỉ trừ những con trỏ liên quan đến nhau, ví dụ các con trỏ trỏ đến các phần tử trong một mảng, kết quả trả về là

“khoảng cách: giữa hai con trỏ. Xét chương trình sau. C++ Code:

Lựa chọn code | Ẩn/Hiện code

#include <iostream> using namespace std; int main(){ int a[10]; int* p1; int* p2; p1=&a[0]; // p1 trỏ đến phần tử đầu mảng p2=&a[9]; // p2 trỏ đến phần tử cuối mảng

cout << p2-p1 << endl; // in ra khoảng cách giữa hai con trỏ

return 0; }

Khi chạy chương trình trên bạn sẽ thấy kết quả là 9 ! Nghĩa là p1 và p2 cách nhau 9 đối tượng kiểu int, tức 36 bytes (chứ không phải 9 bytes).

b. Các phép toán quan hệ trên con trỏ: ==, !=, >=, <=, >, <

Ta có thể so sánh hai con trỏ xem nội dung của chúng (địa chỉ của vùng nhớ mà chúng trỏ tới) có bằng nhau hay không, vùng nhớ nào cao hơn, thấp hơn, … Xem xét chương trình sau.

C++ Code:

Lựa chọn code | Ẩn/Hiện code

#include <iostream>

using namespace std;

int main(){

int a[10]; // mảng 10 số nguyên

int* p=&a[9]; // con trỏ p trỏ đến phần tử cuối mảng

cout << "Input 10 integers: \n"; // nhập vào 10 số nguyên từ cuối đến đầu mảng

while(p>=a){ // khi p còn chưa trỏ về đầu mảng

cin >> *p; // nhập dữ liệu vào các phần tử tương ứng

p--; // dịch con trỏ về đầu mảng (adsbygoogle = window.adsbygoogle || []).push({});

}

p=a; // cho con trỏ p trỏ về đầu mảng

while(p<=&a[9]){ // chừng nào p chưa trôi về cuối mảng

cout << *p << endl; // in ra các phần tử mảng tương ứng

p++; // dịch con trỏ p về cuối mảng

}

return 0; }

Ngoài các phép toán trên, đối với những con trỏ trỏ đến một mảng thì ta cũng có thể dùng phép toán lấy chỉ số như thao tác với tên mảng. Ví dụ chương trình sau:

C++ Code:

Lựa chọn code | Ẩn/Hiện code

#include <iostream>

using namespace std;

int main(){ int a[5];

int* pa=a; // con trỏ pa trỏ đến đầu mảng

cout << "Input array:\n"; for(int i=0; i<5; i++){

cin >> pa[i]; // thao tác qua p, với chỉ số

}

cout << "Ouput array:\n"; for(int i=0; i<5; i++){

cout << pa[i] << " "; // thao tác qua p, với chỉ số

}

return 0; }

Một phần của tài liệu Lý thuyết lập trình C++ (Trang 65 - 67)