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

C++ 指針作函數參數:傳值與傳址的本質區別

     編輯:關於C語言

核心結論

指針參數按值傳遞:實參指針的副本被傳入函數。函數內:

  • 修改 *p(指向的內容)→ 影響實參指向的對象。
  • 修改 p(指針本身,如 p = &other)→ 不影響 實參指針。

代碼演示

情況一:修改指針本身(無效)

void test(int *p) {
    int a = 4;
    p = &a;          // 修改副本指向
    cout << *p << endl; // 輸出 4
}

int main() {
    int x = 3;
    int *p = &x;
    cout << x << endl;   // 3
    test(p);
    cout << *p << endl; // 3(實參指針未變)
}

情況二:修改指向內容(有效)

void test(int *p) {
    *p = 4;           // 修改指向的內存
    cout << *p << endl; // 4
}

int main() {
    int x = 3;
    int *p = &x;
    cout << x << endl;   // 3
    test(p);
    cout << *p << endl; // 4(實參指向對象被修改)
}

深度解析

  1. 形參與實參是兩個獨立變量,儘管同名,佔用不同棧槽。
  2. 指針傳遞的是地址值,但指針變量本身仍按「值傳遞」語義處理。
  3. 一級指針無法修改實參指針指向,若需修改指向(如動態分配內存返回),必須使用二級指針(int**)或指針引用(int*&,C++專有)。

進階:二級指針 / 指針引用修改指向

// C 風格:二級指針
void alloc(int **pp) { *pp = malloc(sizeof(int)); }

// C++ 風格:指針引用
void alloc(int *&p) { p = new int; }

避坑清單

  • ❌ 企圖在函數內 p = malloc(...) 並期望實參指針更新。
  • ✅ 函數參數用 int*& (C++) 或 int** (C) 實現「輸出指針」。
  • ✅ 僅需修改指向對象內容時,一級指針 int* 足矣。
  • ✅ 只讀參數加 const:const int* p(指向常量)、int* const p(常量指針)、const int* const p(雙重常量)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved