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

C++ 函數參數傳指針再探:值傳遞本質與修改策略

     編輯:C++ 入門

經典錯誤代碼


void GetMemory(char *p) { p = new char[20]; }
void Test() {
    char *str = NULL;
    GetMemory(str); // 試圖分配內存
    strcpy(str, "hello"); // Crash! str 仍為 NULL
}

根因分析:值傳遞

C++ 函數參數**永遠是值傳遞**。指針作為參數時,傳遞的是**地址值的副本**。

  • `Test` 中 `str` 地址為 `0x12F464`,值 `NULL` (0x0)。
  • 調用 `GetMemory`,形參 `p` 在棧上分配新地址 `0x12F384`,值複製為 `0x0`。
  • `p = new char[20]` 修改的是副本 `p` 的值(變為 `0x35CF08`),**不影響** `str`。
  • 函數返回,`p` 銷毀,`str` 仍為 `NULL`。

調試視角驗證

觀察變量地址與值變化:

  1. 進入 `Test`:`str@0x12F464 = 0xCCCCCCCC` (未初始化)。
  2. `str = NULL`:`str@0x12F464 = 0x0`。
  3. 進入 `GetMemory`:`p@0x12F384 = 0x0` (複製自 `str`)。
  4. `new` 後:`p@0x12F384 = 0x35CF08`。
  5. 返回 `Test`:`p` 消亡,`str@0x12F464` 仍為 `0x0`。

正確修改指針指向的三種方式

方法原理代碼示例
二級指針傳遞指針地址,修改一級指針值`void GetMem(char **p) { *p = new char[20]; }` / `GetMem(&str);`
引用傳遞C++ 引用是別名,直接修改原變量`void GetMem(char *&p) { p = new char[20]; }` / `GetMem(str);`
返回值函數返回新指針,調用者接收`char* GetMem() { return new char[20]; }` / `str = GetMem();`

指針參數的正確用途

指針參數主要用於**修改指向的內容**(`*p = ...` 或 `p[i] = ...`),而非修改指針本身。例如:


void FillArray(int *arr, int n, int val) {
    for (int i=0;i

總結

**函數參數傳值,指針傳地址值。** 要修改實參指針,必須傳遞其二級指針、引用或用返回值。調試時觀察變量地址與值,能直觀理解副本機制。這是 C/C++ 指針編程的核心認知。

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