Yêu cầu mọi thông tin sao chép từ blog này phải được ghi rõ đầy đủ: Thông tin được sao chép từ "http://www.dangngochoangthanh.blogspot.com".

Cool wallpaper http://www.fancymessage.com

EMOJI KEYBOARD PRO http://emojiselector.com

THƯ VIỆN HÌNH ĐỘNG FLASH ANIMATION: http://flashanimationlibrary.blogspot.ru/

Hệ thống học trực tuyến đang được phát triển và sẽ đưa vào sử dụng vào cuối năm nay. Hãy xem qua một số demo của Học Trực Tuyến.


HỌC TRỰC TUYẾN ĐÃ CUNG CẤP PHIÊN BẢN TRUY CẬP QUA MOBILE http://dangngochoangthanh.blogspot.com/?m=1

XEM KÊNH HỌC TRỰC TUYẾN TRÊN YOUTUBE



Search on This Blog

Saturday, September 11, 2010

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

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
*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.
Bạ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
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