Các phép toán số học trên con trỏ

Một phần của tài liệu Giáo trình lập trình hướng đối tượng c trường cao đẳng công nghiệp huế (Trang 84)

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). Đ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)<<endl; }

Ta 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. Dễ nhận thấy rằng địa chỉ tăng theo 4 byte (0x7ffd5000 tiếp theo 0x7ffd5004,…)

C + + 1000 1001 pchar pchar++ 2000 2001 2002 2003 pshort pshort++ 3000 3001 3002 3003 3004 3005 3006 3007 plong plong++

Hình 1.4 – 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

*p++;

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. Ta cần chú ý rằng, biểu thức này hoàn toàn khác với

(*p)++;

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

*p++ = *q++;

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

C

+

+

Trong trường hợp này, chúng ta nên sử dụng dấu () để có một cách nhìn nhận rõ ràng hơn.

Một phần của tài liệu Giáo trình lập trình hướng đối tượng c trường cao đẳng công nghiệp huế (Trang 84)

Tải bản đầy đủ (PDF)

(197 trang)