許多初學者認為指標只是「儲存位址的 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(如再次複製),會從錯誤位置開始。回退動作模擬陣列游標歸零,保持指標語意一致性。
++/--、+/- n 算術運算,隱含「當前處理位置」語意這正是 C 指標與 Java 參考的根本差異:Java 參考無算術運算,純粹是「標籤」;C 指標既是位址也是可移動的游標。
移除方法二中的回退迴圈 for(;len>0;len--) out--;,觀察輸出結果將異常(通常顯示空字串或亂碼),證明指標位移狀態確實影響後續操作。
指標不僅是 4/8 位元組的位址容器,更是一個可移動的游標。理解這一點,能避免大量指標運算相關的邏輯錯誤。本文出自「起跑人生,追逐夢想,超..」博客。