# 参数与返回值

URL: https://caijiao.org/cpp/function/params
Source: docs/cpp/function/params.md
Description: 本节将介绍 C++ 中函数的参数和返回值。了解如何传递参数到函数中，如何使用不同类型的参数，以及如何处理函数的返回值。掌握这些基础知识是编写有效函数的关键。

在 C++ 中，函数通过**参数**接收外部数据，并通过**返回值**将结果传递给调用者。理解参数和返回值的使用方式，可以使你更加灵活地定义和调用函数。

## 参数传递

C++ 中，函数参数可以通过不同的方式传递，最常见的是**值传递**和**引用传递**。

### 1. 值传递

在值传递中，函数接收到的是参数的副本。修改函数内的参数不会影响外部变量的值。

#### 语法：

```cpp
return_type function_name(type parameter1, type parameter2) {
    // 使用参数
}
````

例如，传递两个整数进行加法计算：

```cpp
int add(int a, int b) {
    return a + b;  // 返回两个数的和
}
```

调用时：

```cpp
int main() {
    int result = add(5, 7);  // 传递值
    cout << "结果是: " << result << endl;
    return 0;
}
```

### 2. 引用传递

在引用传递中，函数接收到的是变量的引用。通过引用传递，函数可以直接修改外部变量的值。

#### 语法：

```cpp
return_type function_name(type& parameter) {
    // 使用参数
}
```

例如，使用引用传递交换两个整数：

```cpp
void swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}
```

调用时：

```cpp
int main() {
    int x = 5, y = 7;
    swap(x, y);  // 引用传递
    cout << "交换后的值: x = " << x << ", y = " << y << endl;
    return 0;
}
```

在这个例子中，`swap` 函数通过引用传递直接修改了外部变量 `x` 和 `y` 的值。

### 3. 指针传递

指针传递与引用传递类似，区别在于传递的是变量的内存地址。通过指针，函数可以访问和修改外部变量。

#### 语法：

```cpp
return_type function_name(type* parameter) {
    // 使用参数
}
```

例如，使用指针传递来交换两个整数：

```cpp
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
```

调用时：

```cpp
int main() {
    int x = 5, y = 7;
    swap(&x, &y);  // 传递指针
    cout << "交换后的值: x = " << x << ", y = " << y << endl;
    return 0;
}
```

通过指针传递，`swap` 函数修改了外部变量 `x` 和 `y` 的值。

## 返回值

C++ 中，函数可以返回任何类型的值。函数的返回类型可以是基本数据类型、类、结构体或指针等。返回值通常用于将函数的计算结果传递给调用者。

### 1. 返回基本类型

例如，返回一个整数值：

```cpp
int multiply(int a, int b) {
    return a * b;  // 返回两个数的乘积
}
```

调用时：

```cpp
int main() {
    int result = multiply(3, 4);
    cout << "结果是: " << result << endl;
    return 0;
}
```

### 2. 返回引用

C++ 允许函数返回一个变量的引用，但要注意返回局部变量的引用是危险的，因为局部变量在函数执行结束后会被销毁。

```cpp
int& getMax(int& a, int& b) {
    return (a > b) ? a : b;  // 返回较大的那个变量的引用
}
```

调用时：

```cpp
int main() {
    int x = 5, y = 10;
    int& max = getMax(x, y);  // 获取较大的变量
    cout << "较大的值是: " << max << endl;
    return 0;
}
```

### 3. 返回指针

函数也可以返回指向对象或数组的指针。返回指针时，要确保返回的指针指向有效的内存地址。

```cpp
int* findMax(int* arr, int size) {
    int* max = arr;
    for (int i = 1; i < size; ++i) {
        if (arr[i] > *max) {
            max = &arr[i];
        }
    }
    return max;
}
```

调用时：

```cpp
int main() {
    int arr[] = {1, 5, 3, 7, 2};
    int* max = findMax(arr, 5);  // 获取最大值的地址
    cout << "最大值是: " << *max << endl;
    return 0;
}
```

## 小结

* **值传递**：传递参数的副本，函数内的修改不会影响外部变量。
* **引用传递**：传递变量的引用，函数内的修改会直接影响外部变量。
* **指针传递**：传递变量的内存地址，允许修改外部变量。
* **返回值**：函数可以返回任何类型的值，包括基本类型、引用、指针等。

了解参数的传递方式和返回值的使用，可以帮助你编写更加灵活、高效的函数。
