c++++ 函數參數的內存分配機制決定了參數在調用期間的存儲方式:按值傳遞:參數副本傳遞,函數修改不影響原始變量。按引用傳遞:參數變量地址傳遞,函數修改反映在原始變量中。常量引用傳遞:類似按引用,但禁止函數修改引用變量。
C++ 函數參數的內存分配機制
在 C++ 中,函數參數的內存分配機制至關重要,因為它決定了參數在函數調用期間如何存儲和使用。理解不同的內存分配機制可以讓您編寫更有效、更可維護的代碼。
按值傳遞
在按值傳遞中,參數的副本被創建并傳遞給函數。這意味著函數內部的任何修改都不會影響調用方的原始變量。
void foo(int x) {
x++; // 修改函數內的副本
}
int main() {
int y = 5;
foo(y); // 傳遞 y 的副本
cout << y; // 輸出仍然是 5,因為 y 的原始變量未修改
}
登錄后復制
按引用傳遞
在按引用傳遞中,參數變量的地址被傳遞給函數。這意味著函數內的任何修改都會反映在調用方的原始變量中。
void foo(int& x) {
x++; // 修改函數內引用的原始變量
}
int main() {
int y = 5;
foo(y); // 傳遞 y 的引用
cout << y; // 輸出為 6,因為 y 的原始變量已修改
}
登錄后復制
常量引用傳遞
常量引用類似于按引用傳遞,但它確保函數內對引用變量的任何修改都是無效的。
void foo(const int& x) {
// 嘗試修改函數內引用的原始變量,但編譯器會報錯
// x++;
}
int main() {
int y = 5;
foo(y); // 傳遞 y 的常量引用
cout << y; // 輸出仍然是 5,因為 y 的原始變量未修改
}
登錄后復制
實戰案例:數組排序
考慮一個需要對數組進行排序的函數。如果使用按值傳遞,則函數將收到數組的一個副本,而對副本進行的任何修改都不會影響原始數組。另一方面,如果使用按引用傳遞,則函數可以修改原始數組并返回排序后的結果。
// 按值傳遞
void sortArray_byValue(int arr[], int size) {
// 創建數組副本并對其進行排序
int arr_copy[size];
for (int i = 0; i < size; i++) {
arr_copy[i] = arr[i];
}
std::sort(arr_copy, arr_copy + size);
}
// 按引用傳遞
void sortArray_byReference(int arr[], int size) {
// 直接對原始數組進行排序
std::sort(arr, arr + size);
}
int main() {
int arr[] = {5, 2, 8, 3, 1};
int size = sizeof(arr) / sizeof(arr[0]);
// 使用按值傳遞排序
sortArray_byValue(arr, size);
for (int i = 0; i < size; i++) {
cout << arr[i] << " "; // 輸出無序數組
}
cout << endl;
// 使用按引用傳遞排序
sortArray_byReference(arr, size);
for (int i = 0; i < size; i++) {
cout << arr[i] << " "; // 輸出已排序的數組
}
}
登錄后復制






