c++中数组做形参的案例
时间: 2024-10-12 19:14:42 浏览: 53
在C++中,你可以将数组作为函数的形参,这使得函数能够处理一段连续的内存数据。下面是一个简单的例子:
```cpp
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
int main() {
int numbers[5] = {1, 2, 3, 4, 5};
int arraySize = sizeof(numbers) / sizeof(numbers[0]); // 获取数组大小
printArray(numbers, arraySize); // 输出数组元素
return 0;
}
```
在这个例子中,`printArray`函数接受一个整型数组`arr`和它的大小`size`作为输入。函数通过遍历数组并打印每个元素来操作它。在`main`函数中,我们创建了一个名为`numbers`的数组,并将其传递给`printArray`。
相关问题
数组指针使用函数调用
### C/C++ 中通过函数参数传递和使用数组指针
在 C 和 C++ 编程语言中,由于数组名本质上是一个指向该数组首元素的常量指针,在函数间传递数组通常意味着传递一个指针。以下是几种常见的方式:
#### 使用一维数组作为函数参数
当向函数传递一维数组时,可以采用如下三种方法之一声明形参[^2]。
1. **直接指定数组类型**
```cpp
void func(int array[]) {
// 函数体...
}
```
2. **利用指针表示法**
```cpp
void func(int *array) {
// 函数体...
}
```
3. **带有固定大小说明符的形式(不推荐)**
```cpp
void func(int array[10]) { // 这里的`10`仅作示意,并不会影响实际操作范围
// 函数体...
}
```
以上三种定义对于编译器而言效果相同,均视为接受了一个 `int*` 类型的实参。因此建议优先选用第二种写法以保持清晰度并增强可读性。
#### 处理多维数组的情况
对于二维或多维数组,则需更精确地标明除最左维度外其他各层的具体长度以便于编译期解析其内存布局:
```cpp
void processMatrix(int matrix[][COLS], int rows);
// 或者
void processMatrix(int (*matrix)[COLS], int rows);
```
这里假设每一行拥有固定的列数 COLS 。注意,即使是最左边的一级也允许留空,但后续各级不可省略尺寸信息。
#### 实际应用案例展示
下面给出一段完整的代码片段用于演示如何实现上述概念:
```cpp
#include <iostream>
using namespace std;
const int SIZE = 5;
// 定义处理单个整形数组的方法
void printArray(const int arr[], size_t length){
cout << "[ ";
for (size_t i=0 ;i<length;i++){
cout<<arr[i]<<" ";
}
cout << "]";
}
// 定义处理矩阵的方法
void printMatrix(const int mat[][SIZE], size_t row_count){
for(size_t r=0;r<row_count;++r){
printArray(mat[r], SIZE);
printf("\n");
}
}
int main(){
int my_array[] = {1,2,3,4,5};
int my_matrix[][SIZE]={
{1,2,3,4,5},
{6,7,8,9,10}
};
// 调用打印一维数组
printArray(my_array,sizeof(my_array)/sizeof(*my_array));
// 打印分隔线
puts("");
// 调用打印二维数组/矩阵
printMatrix(my_matrix, sizeof(my_matrix)/sizeof(*my_matrix));
return 0;
}
```
这段程序展示了怎样创建以及遍历访问传入到函数内的简单数据结构实例——无论是单一列表还是表格形式的数据集合都能被有效管理起来。
lambda C++
### C++ 中的 Lambda 表达式
#### 基本概念
Lambda 表达式是一种匿名函数对象,可以在定义的地方立即使用。其主要用途是在需要函数对象作为参数的情况下简化代码编写过程。
#### 语法结构
一个典型的 lambda 表达式的构成如下:
- **捕获列表**:用于指定哪些外部变量可以被访问以及如何访问这些变量(按值还是按引用)。例如 `[=]`表示按值捕获所有局部变量[^1]。
- **形参列表**:类似于普通函数的参数声明部分;如果不需要任何参数,则此部分可省略。
- **返回类型说明符**(可选):默认情况下编译器会自动推导返回类型,但如果希望显式指明也可以加上 `-> 返回类型` 的形式。
- **函数体**:即执行的具体逻辑所在之处。
#### 实际应用案例
下面给出几个具体的实例来展示不同场景下的 lambda 应用方式:
##### 示例一:简单求和操作
```cpp
#include <iostream>
using namespace std;
int main() {
int a = 5, b = 6;
auto f = [=]() { return a + b; }; // 定义了一个简单的lambda表达式,它将a和b相加
cout << f() << endl; // 输出两数之和的结果
}
```
此处展示了最基础的形式——创建一个不带参数只做特定运算的小型闭包,并通过调用 `f()` 来获取最终结果。
##### 示例二:遍历容器元素
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
vector<int> vec = {1, 2, 3, 4, 5};
// 使用 Lambda 表达式打印每个元素
for_each(vec.begin(), vec.end(), [](int x) {
cout << x << " ";
});
cout << endl;
}
```
这段程序利用了标准库算法 `for_each` 配合 lambda 函数实现了对向量内各成员逐一遍历输出的功能[^2]。
##### 示例三:累加工具配合多线程加速
当涉及到大量数据处理任务时,合理运用并发技术能够显著提升性能表现。这里介绍一种基于并行模式的标准模板库 (STL) 方法:
```cpp
#include <execution>
#include <numeric>
#include <vector>
#include <iostream>
using namespace std;
int main(){
vector<double> data(10000);
iota(data.begin(), data.end(), 0); // 初始化data数组为连续整数值序列
double sum = reduce(execution::par_unseq,
data.cbegin(),
data.cend());
cout << "Sum of elements is " << sum << '\n';
}
```
在这个例子中,`reduce` 结合了 parallel execution policy (`execution::par_unseq`) 和 lambda 表达式完成了高效的大规模数值累积工作[^3]。
阅读全文