首先我们要知道C++对于返回值的类型是有限制的——不能是数组。
我们来看看这条语句 int sum_arr(int arr[], int n)是否是正确的呢?
这条语句是正确的,但是不是说返回值不能是数组吗?形参为啥是int arr[]还可以呢?int arr[]真的是数组吗?
arr实际上并不是一个数组,而是一个指针。
我们学过数组可以知道,将数组名视为指针,我们的数组名是数组第一个元素的地址,所以我们用的是它的地址,而不是数组。
那有没有例外的情况呢?其实是有的。
(1)数组声明使用数组名来标记存储的位置。
(2)对数组名使用sizeof将得到整个数组的长度(以字节为单位)。
(3)将地址运算符&用于数组名时,将返回整个数组的地址。
所以我们可以认为:
int sum = sum_arr(cookies, ArSize);
int sum_arr(int *arr, int n);
这两个语句是一样的,我们只是用int *arr 替换了int arr[],当且仅当用于函数头或函数原型中,int *arr 和 int arr[] 的含义才是相同的,它们都是意味着arr是一个int指针。
其中我们要认识两个重要的公式:
arr[ i ] == *(arr + i)
&arr[ i ] == arr + I
记住,将指针(包括数组名)加1,实际上是加上了一个与指针指向的类型的长度(以字节为单位)相等的值。可以理解为指针偏移i个元素。
将数组作为参数意味着什么?
int sum_arr(int arr[], int n),实际上并没有将数组内容传递给函数,而是数组的位置(地址)、包含的元素种类(类型)以及元素数目(n的变量)提交给函数。
传递常规常量时,函数将使用该变量的拷贝;但传递数组时,函数将使用与原来的数组。但这不违反C++按值传递的方法,sum_arr()还是传递了一个值,这个值被赋给一个新变量,但这个值是一个地址,而不是数组的内容。
将数组名与指针对应,可将数组地址作为参数可以节省复制整个数组所需的时间和内存,但是使用原始数据增加了破坏数据的风险。我们可以采用const限定符提供解决这中问题。
总结:
1、我们可以将数组作为形参写进函数的,eg:int sum_arr(int arr[], int n),我们要正确了解,int arr[]不是数组,而是指针,我们只是写成了数组的形式,它本质还是指针。
2、为将数组类型和元素数量告诉数组处理函数,我们要用两个不同的参数来传递它们,eg:void fillArray(int arr[], int size)
3、不要试图使用方括号表示法来传递数组长度,eg:void fillArray( int arr[size] )是错误的。
程序例子:
#include <iostream>
const int ArSize = 8;
using namespace std;
int sum_arr(int arr[], int n);
int main(void)
{
int cookies [ArSize] = {1,2,4,8,16,32,64,128};
cout << cookies << " = array address, " << endl;
cout << sizeof(cookies) << " = sizeof cookies " <<endl;
int sum = sum_arr(cookies, ArSize);
cout << "Total cookies eaten: " << sum << endl;
sum = sum_arr(cookies, 3);
cout << "First three eaters ate " << sum << " cookies " << endl;
sum = sum_arr(cookies + 4, 4);
cout << "Last four eaters ate " << sum << " cookies." << endl;
return 0;
}
int sum_arr(int arr[], int n)
{
int total = 0;
cout << arr << " = arr, " << endl;
cout << sizeof(arr) << " = sizeof arr" << endl;
for (int i = 0;i < n ; i++)
total = total + arr[i];
return total;
}
运行结果:
0x9ff8fc = array address,
32 = sizeof cookies
0x9ff8fc = arr,
4 = sizeof arr
Total cookies eaten: 255
0x9ff8fc = arr,
4 = sizeof arr
First three eaters ate 7 cookies
0x9ff90c = arr,
4 = sizeof arr
Last four eaters ate 240 cookies.
--------------------------------
Process exited after 0.3507 seconds with return value 0
请按任意键继续. . .