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

C語言指針經典四題:參數傳遞、交換陷阱與野指針

     編輯:關於C語言

C語言指針經典四題:參數傳遞、交換陷阱與野指針

指針是 C 語言的靈魂,也是面試與考試高發區。本文通過四個精心設計的例子,揭示指針參數傳遞、值交換、地址交換與野指針的核心區別。

例 1:參數順序與解引用

void fun(int *x, int *y) {
    printf("%d, %d\n", *x, *y);  // 輸出 2, 1
    *x = 3; *y = 4;
}
int main() {
    int x = 1, y = 2;
    fun(&y, &x);  // 故意顛倒傳遞
    printf("%d, %d\n", x, y);  // 輸出 4, 3
}

解析:實參 &y 對應形參 x,&x 對應 y。函數內修改的是實參指向的內存,故主函數中 x 變 4,y 變 3。指針傳遞實現「傳地址」模擬引用。

例 2:正確交換值

void swap(int *p1, int *p2) {
    int temp = *p1; *p1 = *p2; *p2 = temp;
}
int main() {
    int a, b; int *p1=&a, *p2=&b;
    scanf("%d %d", p1, p2);  // 輸入 2 5
    swap(p1, p2);
    printf("%d, %d\n", *p1, *p2);  // 輸出 5, 2
}

關鍵:對 *p1、*p2 解引用操作,修改的是主函數中 a、b 的值。

例 3:錯誤交換——只換指針不換值

void swap(int *p1, int *p2) {
    int *temp = p1; p1 = p2; p2 = temp;  // 僅交換局部指針變量
}
int main() {
    int a, b; int *p1=&a, *p2=&b;
    scanf("%d %d", p1, p2);  // 輸入 2 5
    swap(p1, p2);
    printf("%d, %d\n", *p1, *p2);  // 輸出 2, 5(未變!)
}

原因:形參 p1、p2 是主函數指針的副本。函數內交換副本不影響原指針,且未對 *p1 解引用修改內存值。

例 4:野指針導致非法內存寫入

void swap(int *p1, int *p2) {
    int *temp;          // 未初始化,野指針
    *temp = *p1;        // 寫入隨機地址 → 崩潰
    *p1 = *p2;
    *p2 = *temp;
}

後果:temp 指向不可預知地址,寫入可能破壞系統數據導致崩潰。修正:int *temp = malloc(sizeof(int)); 或改用 int temp;(例 2 做法)。

核心總結

場景正確做法常見錯誤
交換值解引用修改 *p只修改指針變量 p
臨時變量用普通變量 int temp用未初始化指針 int *temp
參數傳遞傳遞地址 &var傳遞值 var 導致無法修改原變量

牢記:指針傳遞的是地址副本,要修改原變量必須解引用;指針變量本身必須指向合法內存才能讀寫。

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