Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Toán học con trỏ (Pointer Arithmetic) trong C/C++

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).