Toán học con trỏ cho phép cộng/trừ số nguyên với con trỏ, hoặc trừ hai con trỏ cùng kiểu. Kết quả phụ thuộc kích thước kiểu dữ liệu trỏ tới.
ptr + n: Tăng địa chỉn * sizeof(*ptr)byte.ptr - n: Giảm địa chỉn * sizeof(*ptr)byte.ptr1 - ptr2: Số phần tử giữa hai con trỏ (chỉ hợp lệ cùng mảng).++ptr,ptr++: Tăng 1 phần tử.--ptr,ptr--: Giảm 1 phần tử.
Ví dụ
#include <stdio.h>
int main() {
int val = 28;
int *pt = &val;
printf("Dia chi ban dau: %p\n", (void*)pt);
pt = pt + 5;
printf("Cong 5: %p\n", (void*)pt); // +5*4 = +20 bytes
pt = pt - 5;
printf("Tru 5: %p\n", (void*)pt); // Ve ban dau
pt = pt + 1;
printf("Tang 1: %p\n", (void*)pt); // +4 bytes
pt = pt - 1;
printf("Giam 1: %p\n", (void*)pt); // Ve ban dau
return 0;
}
Kết quả (ví dụ 32-bit int, 64-bit pointer)
Dia chi ban dau: 0x7ffc1234567c
Cong 5: 0x7ffc12345690
Tru 5: 0x7ffc1234567c
Tang 1: 0x7ffc12345680
Giam 1: 0x7ffc1234567c
Giải thích: int 4 bytes. pt + 5 nhảy 5*4=20 bytes (0x14). pt + 1 nhảy 4 bytes.
Quy tắc quan trọng
- Chỉ hợp lệ trong cùng một mảng (hoặc một phần tử sau cuối).
- Vượt khỏi ranh mảng = Undefined Behavior.
- Trừ 2 con trỏ khác mảng = UB.
- Không thể cộng 2 con trỏ, nhân/chia con trỏ.
Kiến trúc: Trên 32-bit,
sizeof(int*)=4, sizeof(int)=4 -> +1 nhảy 4. Trên 64-bit, sizeof(int*)=8, sizeof(int)=4 -> +1 vẫn nhảy 4 (theo kiểu trỏ tới).