文章目錄
- C語言
- 值傳遞
- 地址傳遞
- C++
- 引用傳遞
C語言
值傳遞
這種方式使用變量、數組元素作為函數參數,實際是將實參的值復制到形參相應的存儲單元中,即形參和實參分別占用不同的存儲單元,這種傳遞方式稱為“參數的值傳遞”。在調用結束后,形參的存儲單元被釋放,而形參值的任何變化都不會影響到實參的值,實參的存儲單元仍保留并維持數值不變。
例子:
#include <stdio.h>
void swap(int x, int y) {int tmp;tmp = x;x = y;y = tmp;printf("x = %d, y = %d\n", x, y);
}
int main() {int a = 10;int b = 20;swap(a, b);printf("a = %d, b = %d\n", a, b);return 0;
}
運行結果:
對上面的例子進行修改:
#include <stdio.h>void test(int x) {x = 1024;printf("test函數內部 x = %d\n", x);printf("x的地址為:%p\n", &x);
} int main() {int x = 1;printf("調用test前 x = %d\n", x); //1test(x); //1024printf("x的地址為:%p\n", &x);printf("調用test后 x = %d\n", x); //1return 0;
}
可以看出運行結果與我們之前描述的一致。
地址傳遞
這種方式使用數組名或者指針作為函數參數,傳遞的是該數組的首地址或指針的值,而形參接收到的是地址,即指向實參的存儲單元,形參和實參占用相同的存儲單元,這種傳遞方式稱為“參數的地址傳遞”。
地址傳遞的特點是形參并不存在存儲空間,編譯系統不為形參數組分配內存
。數組名或指針就是一組連續空間的首地址。因此在數組名或指針作函數參數時所進行的傳送只是地址傳送,形參在取得該首地址之后,與實參共同擁有一段內存空間,形參的變化也就是實參的變化。
#include <stdio.h>// 修改1:參數改為指針類型
void test(int *px) { // px指向main中的x*px = 1024; // 通過指針修改原變量printf("test函數內部 *px = %d\n", *px); // 1024printf("px的值為:%p (指向main中的x)\n", px); printf("px自身地址為:%p\n", &px); // 指針自身的地址,也就是指向px的指針,又叫做二級指針// int **ppx = &px;
} int main() {int x = 1;printf("調用test前 x = %d\n", x); //1printf("x的地址為:%p\n", &x);// 修改2:傳遞x的地址test(&x); // 傳遞x的地址printf("調用test后 x = %d\n", x); //1024 被修改了return 0;
}
運行結果:
此外,如果想修改main函數中x的值,還有兩種辦法。
- 直接返回修改后的值
這種方法適用于單返回值的情況:
#include <stdio.h>int test(int x) {x = 1024; // 修改局部副本return x; // 返回新值
} int main() {int x = 1;printf("調用test前 x = %d\n", x); //1// 獲取返回值并賦值給xx = test(x); printf("調用test后 x = %d\n", x); //1024return 0;
}
2. 使用全局變量
#include <stdio.h>int x; // 全局變量void test() {x = 1024; // 直接修改全局變量
} int main() {x = 1;printf("調用test前 x = %d\n", x); //1test(); // 不需要傳遞參數printf("調用test后 x = %d\n", x); //1024return 0;
}
但是,使用全局變量通常不是好的做法,因為它使得程序難以維護和理解。
C++
引用傳遞
<cstdio>
是 C++ 標準庫中的一個頭文件,它包含了 C 語言標準 I/O 庫的 C++ 封裝,主要用于文件的輸入和輸出操作。
C++引用聲明的語法為:數據類型& 引用名 = 被引用變量;
,作為函數參數:返回值類型 函數名(數據類型& 參數名)
理解:引用不是新變量,而是已存在變量的別名,引用在編譯后直接綁定到目標地址,不產生額外內存分配。
形式上,聲明的形式具有相似性:
int* ptr; // 指針聲明
int& ref; // 引用聲明// 清晰區分參數類型
void func(int param); // 值傳遞
void func(int* param); // 指針傳遞
void func(int& param); // 引用傳遞
代碼如下:
#include <iostream>using namespace std;int main() {int person = 10; // 實體:變量personint& idCard = person; // 引用idCard是person的別名person = 20; // 通過原名修改cout << idCard; // 輸出20 - 通過別名訪問idCard = 30; // 通過別名修改cout << person; // 輸出30 - 原名也隨之改變int original = 42;int& alias = original;cout << "變量地址: " << &original << endl; cout << "引用地址: " << &alias << endl;
}