Các phép toán số học trên con trỏ tương đối khác với phép toán số học trên số nguyên. Chúng ta cũng tham khảo các phép toán tương ứng với nó.
Phép cộng và phép trừ
Giả sử, chúng ta có ba con trỏ khai báo như sau
char *pchar; short *pshort;
int *pint; |
và các biến trỏ này lần lượt trỏ vào các ô nhớ 1000, 2000 và 3000. Khi ta viết
pchar++; pshort++;
pint++; |
nó sẽ lần lượt nhảy sang địa chỉ của ô nhớ tiếp theo (ô nhớ dịch sang phải một đơn vị, tức là tương ứng với 1001, 2002 và 3004). Bạn có thể thắc mắc tại sao lại thế. Điều này cũng rất đơn giản. Kiểu dữ liệu char chiếm một byte, nên ô tiếp theo sẽ là địa chỉ của ô hiện tại +1. Kiểu dữ liệu short chiếm 2 byte, nên địa chỉ ô tiếp theo +2. Kiểu dữ liệu long chiếm 4 byte, nên địa chỉ của ô tiếp theo là +4.
Chương trình | Kết quả |
int *p; for(int i=0; i<4; i++){
*(p+i)=i;
cout<<*(p+i)<<” “<<(p+i)<
} |
|
Bạn có thể thấy giá trị và vùng địa chỉ của biến trỏ nguyên như trong kết quả trên. Bạn có thể thấy địa chỉ tăng theo 4 byte (0x7ffd5000 tiếp theo 0x7ffd5004,…)
Bạn có thể quan sát lược đồ sau đây
Hình 11 – Tăng/Giảm địa chỉ của con trỏ
Kết quả này tương đương với pchar+1, pshort+1 và plong+1.
Hoàn toàn tương tự với toán tử ++p, p– và –p.
Toán tử tham chiếu ngược và toán tử tăng-giảm
Cả hai toán tử tăng và giảm có độ ưu tiên cao hơn toán tử tham chiếu ngược. Nếu ta đặt
Do toán tử ++ có độ ưu tiên cao hơn toán tử *, nên biểu thức này tương ứng với *(p++). Vì vậy, biểu thức này có nghĩa là lấy giá trị ánh xạ bởi ô nhớ tiếp theo.
Bạn chú ý rằng, biểu thức này hoàn toàn khác với
Trong biểu thức này, dấu () có độ ưu tiên cao nhất, nên biểu thức *p sẽ thực hiện trước, do đó, giá trị của biểu thức này là giá trị ánh xạ bởi ô nhớ hiện tại cộng thêm 1.
Biểu thức
Bởi vì toán tử ++ có độ ưu tiên cao hơn toán tử *, cả hai biến p và q đều tăng, nhưng bởi vì chúng đều là toán tử hậu tố, nên toán tử * sẽ được thực hiện trước, sau đó mới tăng địa chỉ của biến tương ứng. Như vậy, biểu thức trên tương ứng với
*p = *q; ++p; // hay p=p+1;
++q; // hay q=q+1 |
Trong trường hợp này, tôi khuyên bạn nên sử dụng dấu () để có một cách nhìn nhận rõ ràng hơn.
No comments:
Post a Comment