Con trỏ - Bài 9 : Phép toán số học trên con trỏ (Phần 1)

-Các phép tính cơ bản cho các biến con trỏ có kiểu(tức không phải là void*)
*Phép cộng, trừ với số: con trỏ(địa chỉ bộ nhớ) +(hoặc -) số nguyên. Phép toán này có ý nghĩa là tạo ra một địa chỉ bộ nhớ có độ lệch so với địa chỉ gốc một số byte tùy thuộc vào kiểu con trỏ và số nguyên mà ta cộng hay trừ vào địa chỉ.
*Phép trừ 2 con trỏ: con trỏ(địa chỉ 1) - con trỏ(địa chỉ 2). Phép toán này yêu cầu 2 con trỏ phải có cùng kiểu. Kết quả cho ra độ lệch địa chỉ có đơn vị tính tùy thuộc vào kiểu con trỏ.
 -Riêng đối với kiểu void*(con trỏ vô kiểu) thì không thể thực hiện 2 phép toán nói trên. Khi muốn tính toán địa chỉ trên con trỏ vô kiểu thì ta phải ép kiểu con trỏ. Thông thường nếu muốn tính theo đơn vị byte thì các con trỏ được ép kiểu sang char*.
- Giả sử pVar là biến con trỏ kiểu T* với T là một kiểu dữ liệu nào đó khác kiểu void và n là 1 số nguyên(có thể âm hay dương). Khi đó pVar + n là địa chỉ bộ nhớ sẽ dời đi so với địa chỉ pVar một độ dời là n x sizeof(T).Nghĩa là chúng ta có công thức sau:
 Địa chỉ(pVar + n) = Địa chỉ(pVar) + n x sizeof(T)
Công thức nói trên cũng lý giải tại sao con trỏ kiểu void* không thể cộng hay trừ với số nguyên bởi vì sizeof(void) không xác định. Đối với con trỏ kiểu char* vì sizeof(char) = 1 nên khi T = char thì pVar + n dời đi so với pVar đúng n byte.
 Quy ước ký pháp: Với điều kiện địa chỉ hợp lệ thì ký hiệu *(pVar + n) được đồng nhất với biến kiểu T tại địa chỉ pVar + n, biến này cũng có thể được truy xuất đến bằng cách dùng ký hiệu mảng pVar[n].
 - Giả sử 2 biến con trỏ pVar1 và pVar2 cùng có kiểu là T* với T là 1 kiểu dữ liệu nào đó khác void. Khi đó pVar1 - pVar2 là độ lệch được tính bằng sizeof(T), nói 1 cách đơn giản hơn là độ lệch này được tính bằng số lượng các phần tử có kiểu là T. Tức là ta có công thức sau:
                             Địa chỉ(pVar1) - Địa chỉ(pVar2) 
 pVar1 - pVar2 = ---------------------------------------
                                          sizeof(T) 
-> Áp dụng công thức khi T = char thì (char*)pVar1 - (char*)pVar2 là độ lệch địa chỉ giữa 2 con trỏ được tính bằng đơn vị là byte.

Nhận xét