C++ 数组作为参数、返回值
数组作为参数
一维数组作为参数
1、传入数组int[]
为了规范常常需要将数组的size一同传入,因为数组作为参数时数组在函数内退化为数组的首地址:int sum(int array[], int size)
2、传入数组首地址int *,与上面一种没有本质的区别:int sum(int * array, int size)
#include <iostream> using namespace std; int getAverage(int arr[], int size) { //传入指针的写法:int getAverage(int * arr, int size) int sum = 0; int avg = 0; for (int i = 0; i < size; i++) { sum += arr[i]; } avg = sum / size; return avg; } int main() { int balance[5] = { 1000, 2, 3, 17, 50 }; int avg; avg = getAverage(balance, 5); //传入指针时的实现也是这样,因为balance本身就是数组的首地址 cout << "平均值是:" << avg << endl; return 0; }
二维数组作为参数
与一维数组一样,但区别在于必须写出列数。数组在调用时存在降价的问题,实际函数得到的是一个指针,指向行向量构成的一维数组,这样每一个一维数组的size必须提前定义好,便于分配空间。
- int sum(int arr[][4], int size)
- int sum(int (*arr)[4], int size)
- int sum(int **arr, int n, int m) //使用二维指针,n、m分别代表行数、列数
//二维数组的使用方法一:因为每一行都是单独new的,坏处是导致数组空间不连续 int sum(int** arr, int n, int m); int** arr = new int* [n]; for (int i = 0; i < n; i++) { arr[i] = new int[m]; } for (int i = 0; i < n; i++) { delete[] arr[i]; } delete[] arr;
//二维数组使用方法二:内存空间连续 int sum(int** arr, int n, int m); int** arr = new int* [n]; arr[0] = new int[n * m]; delete []arr[0]; delete []arr;
一般情况下前两种够用,但如果列大小未知,可以通过手动new、delete空间使用后面两种方式
函数返回数组
在C++中,数组不是一种类型,因此不能被直接返回,一般有两种方法来返回数组。
1、返回一个指向数组的指针
#include <iostream> using namespace std; int* getSum(int * arr0, int * arr1, int size) { int *sum; sum = new int[size]; for (int i = 0; i < size; i++) { sum[i] = arr0[i] + arr1[i]; } return sum; } int main() { int A[5] = { 1000, 2, 3, 17, 50 }; int B[5] = { 100,200,300,400,500 }; int *sum; sum = getSum(A, B, 5); return 0; }
2、返回一个结构形式。这种形式相对较安全,可以避免忘记释放指针而造成内存泄漏,也可以避免访问指针造成的错误。缺点是由于结构是先拷贝再返回,因此如果结构较大时,会影响效率和占用较大内存。
#include <iostream> using namespace std; class tag { public: int a[10]; }X; class tag Array() { for (int i = 0; i < 10; i++) { X.a[i] = i + 1; } return X; } int main() { class tag Y = Array(); for (int i = 0; i < 10; i++) { cout << Y.a[i] << " "; } cout << endl; return 0; }