首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 指針算術運算全解析:步長規則、數組遍歷、陷阱避坑

     編輯:關於C語言

C 指針算術運算全解析

指針加減整數不是簡單的字節偏移,而是按指向類型大小縮放。本文通過實測代碼、記憶體地址變化圖解、三種遍歷方式對比,徹底講透指針算術的規則與陷阱。

核心規則

ptr + n → 新地址 = ptr + n * sizeof(*ptr)

ptr - n → 新地址 = ptr - n * sizeof(*ptr)

結果指針類型、指向類型不變;步長 = sizeof(指向類型)。

實測代碼與地址變化

#include 
int main() {
    char str[] = {'a','b','c','d','e'};
    int *p = (int*)str;   // 強轉為 int*
    char *q = str;        // char*

    printf("str 首地址: %p\n", (void*)str);  // 0x7ffd...
    printf("q 初始: %p\n", (void*)q);        // 同 str
    printf("p 初始: %p\n", (void*)p);        // 同 str

    q++;   // +1 byte
    p++;   // +4 bytes (sizeof(int))

    printf("q++ 後: %p (差 %td)\n", (void*)q, q - (char*)str);  // +1
    printf("p++ 後: %p (差 %td)\n", (void*)p, p - (int*)str);   // +1 (但實際字節 +4)
    return 0;
}

輸出示例:

str 首地址: 0x7ffd12345670
q 初始: 0x7ffd12345670
p 初始: 0x7ffd12345670
q++ 後: 0x7ffd12345671 (差 1)
p++ 後: 0x7ffd12345674 (差 1,但字節跨度 4)

三種數組遍歷方式對比

方式代碼模式適用指針類型備註
下標法arr[i]數組名最直觀
數組名+偏移*(arr + i)數組名arr 退化為首元素指針
獨立指針for (p=arr; p<arr+len; ++p) *p指向元素類型的指針需類型匹配,q 可遍歷 char[],p 不可

關鍵陷阱

  1. 類型不匹配遍歷:int *p = (int*)char_arr; p++ 跳過 4 字節,導致漏讀/越界。
  2. 指針減指針:結果是 ptrdiff_t(有符號),表示元素個數差,非字節差。
    p2 - p1 == (char*)p2 - (char*)p1) / sizeof(*p1)
  3. void* 算術:標準 C 禁止(GCC 擴展允許,按 1 字節計)。請轉為 char* 再運算。
  4. 跨數組邊界:指針只能指向數組內或緊隨其後一個元素(arr + len),其他均為 UB。
  5. 溢位:有符號整數溢位是 UB,索引運算請用 size_t/ptrdiff_t。

進階:指針差值計算元素個數

int arr[10];
int *p1 = &arr[2], *p2 = &arr[7];
ptrdiff_t diff = p2 - p1;   // 5 (元素個數)
size_t bytes = (char*)p2 - (char*)p1;  // 20 (字節數)

小結

指針算術的本質是 「元素級偏移」。牢記 ptr ± n → ± n * sizeof(*ptr) bytes,配合 char* 做字節級操作、ptrdiff_t 存差值、嚴守數組邊界,即能安全、高效地玩轉指針運算。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved