一、基本语法
1. 传递一维数组
-
函数声明:
cpp
复制
void FunctionName(type &arrayName[], ...) // 按引用传递
或
cpp
复制
void FunctionName(type arrayName[], ...) // 省略 & 符号,但依然按引用传递
-
调用函数:
cpp
复制
FunctionName(existingArray, ...);
2. 传递多维数组
-
函数声明:
必须指定除第一维外的其他维度大小:cpp
复制
void FunctionName(type &arrayName[][2], ...) // 二维数组,第二维固定为2
二、核心规则
-
按引用传递
-
函数内部修改数组内容会直接影响原始数组。
-
无需返回数组即可保留修改结果。
-
-
动态数组与静态数组
-
动态数组(未预定义大小)可自由调整大小(通过
ArrayResize
)。 -
静态数组(预定义大小)作为参数时,需确保函数内不越界访问。
-
-
多维数组限制
-
除第一维外,其他维度大小必须明确指定。
-
三、示例代码
示例 1:修改数组内容
cpp
复制
// 定义一个函数,将数组所有元素乘以系数 void MultiplyArray(double &arr[], double factor) { for(int i = 0; i < ArraySize(arr); i++) { arr[i] *= factor; } } // 调用示例 void OnStart() { double prices[] = {1.0, 2.0, 3.0}; MultiplyArray(prices, 2.0); // 原始数组变为 {2.0, 4.0, 6.0} }
示例 2:传递动态数组并调整大小
cpp
复制
// 定义一个函数,向动态数组添加新元素 void AppendToArray(int &arr[], int value) { int size = ArraySize(arr); ArrayResize(arr, size + 1); // 扩展数组大小 arr[size] = value; // 添加新值 } // 调用示例 void OnStart() { int data[]; AppendToArray(data, 10); // data = {10} AppendToArray(data, 20); // data = {10, 20} }
示例 3:多维数组传递
cpp
复制
// 定义一个函数,打印二维数组内容 void Print2DArray(int &arr[][2]) { for(int i = 0; i < ArrayRange(arr, 0); i++) { Print("元素 ", i, ": ", arr[i][0], ", ", arr[i][1]); } } // 调用示例 void OnStart() { int matrix[3][2] = {{1, 2}, {3, 4}, {5, 6}}; Print2DArray(matrix); }
四、注意事项
-
避免越界访问
在函数内部使用ArraySize()
或ArrayRange()
获取数组实际大小,确保索引有效性。 -
性能优化
传递大型数组时,按引用传递不会复制数据,性能高效。 -
强制按值传递(变通方法)
如果需要避免修改原数组,可先复制数组到临时变量:cpp
复制
void SafeFunction(const double &srcArray[]) { double tempArray[]; ArrayCopy(tempArray, srcArray); // 复制到临时数组 // 操作 tempArray,原数组不受影响 }
五、实际应用场景
场景:计算移动平均线(MA)
cpp
复制
// 函数:计算简单移动平均 void CalculateSMA(const double &priceSeries[], int period, double &output[]) { int size = ArraySize(priceSeries); ArrayResize(output, size - period + 1); for(int i = 0; i < size - period + 1; i++) { double sum = 0.0; for(int j = 0; j < period; j++) { sum += priceSeries[i + j]; } output[i] = sum / period; } } // 调用示例 void OnStart() { double closePrices[100]; CopyClose(Symbol(), PERIOD_CURRENT, 0, 100, closePrices); double maResults[]; CalculateSMA(closePrices, 14, maResults); // 计算14周期MA }
六、常见错误
-
静态数组越界
cpp
复制
void BadFunction(int arr[5]) { arr[5] = 10; // 错误!索引 5 越界(合法索引为0-4) }
-
未初始化动态数组
cpp
复制
void ProcessArray(int &arr[]) { ArrayResize(arr, 10); // 必须确保数组是动态声明的 }