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] << " "; // 輸出已排序的數組 } }
登錄后復制