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

C 語言指標深度理解:從字串複製看指標的游標本質

     編輯:關於C語言

前言

許多初學者認為指標只是「儲存位址的 4 位元組整數」,實際上指標還隱含著游標位移語意。透過兩種字串複製函數的對比,揭示指標運算的核心機制。

兩種複製策略對比

// 方法一:返回新指標(Java 風格)
char* copy_1(const char* in, char* out) {
    char *t = out;  // 保存起始位址
    while ((*out++ = *in++) != '\0');
    *(++out) = '\0';
    return t;       // 返回原始起始位址
}

// 方法二:void 返回,指標歸零(C 風格)
void copy_2(const char* in, char* out) {
    int len = 0;
    while ((*out++ = *in++) != '\0') len++;
    *(++out) = '\0';
    for (; len > 0; len--) out--;  // 關鍵:指標回退到陣列開頭
}

核心差異分析

方法一:額外變數保存起始位址

out 在複製過程中不斷遞增,最終指向字串結尾。若直接返回 out,呼叫端拿到的是結尾位址而非開頭。因此需額外變數 t 保存初始位址並返回。

方法二:複製後手動回退指標

同樣 out 走到結尾,但函數為 void,呼叫端仍持有原始指標 t(main 中的 t)。若不回退 out,呼叫端的 t 無變化,**但**若後續在函數內繼續操作 out(如再次複製),會從錯誤位置開始。回退動作模擬陣列游標歸零,保持指標語意一致性。

指標的雙重本質

  1. 位址值:指向物件的記憶體位置
  2. 游標位移:支援 ++/--、+/- n 算術運算,隱含「當前處理位置」語意

這正是 C 指標與 Java 參考的根本差異:Java 參考無算術運算,純粹是「標籤」;C 指標既是位址也是可移動的游標。

實驗驗證

移除方法二中的回退迴圈 for(;len>0;len--) out--;,觀察輸出結果將異常(通常顯示空字串或亂碼),證明指標位移狀態確實影響後續操作。

結語

指標不僅是 4/8 位元組的位址容器,更是一個可移動的游標。理解這一點,能避免大量指標運算相關的邏輯錯誤。本文出自「起跑人生,追逐夢想,超..」博客。

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