我们一般使用函数时,函数参数大多数都是int,couble,char之类的类型,我们接下来可以看看当函数里需要用到数组时,c++是如何实现的。下面给出的例子是c++primer的例子,在此这里简化了下。
#include <iostream>
const int ArSize = 8; //数组个数
int sum_arr(int arr[], int n); // 申明函数属性
int main()
{
using namespace std;
int cookies[ArSize] = {1,2,3,4,5,6,7,8}; //初始化数组
int sum = sum_arr(cookies, ArSize); //函数调用
cout << "Total cookies eaten: " << sum << "\n";
system("pause");
return 0;
}
//求和函数
int sum_arr(int arr[], int n)
{
int total = 0;
for (int i = 0; i < n; i++)
total = total + arr[i];
return total;
}
这个程序很简单,就是一个数组求和函数,需要我们注意的函数参数传递,int sum_arr(int arr[], int n),这里我们可以思考一下,为什么我们还需要一个int来表示数组里面的元素个数。一般我们可以利用sizeof函数来直接求出数组元素的个数,这里可以吗?不妨一试。
#include <iostream>
const int ArSize = 8; //数组个数
int sum_arr(int arr[], int n); // 申明函数属性
int main()
{
using namespace std;
int cookies[ArSize] = {1,2,3,4,5,6,7,8}; //初始化数组
cout<<"Cookies size:"<<sizeof(cookies)/sizeof(cookies[0])<<endl;//新增代码 计算数组个数
int sum = sum_arr(cookies, ArSize); //函数调用
cout << "Total cookies eaten: " << sum << "\n";
system("pause");
return 0;
}
//求和函数
int sum_arr(int arr[], int n)
{
using namespace std;
int total = 0;
cout<<"arr size: "<<sizeof(arr)/sizeof(arr[0])<<endl;
for (int i = 0; i < n; i++)
total = total + arr[i];
return total;
}
看到结果就应该明白了,我们传进去的数组地址,用sizeof计算完后,只有一个。而在main函数中,用sizeof计算得出有8个字节,虽然两者都是数组的首地址,但是仍然存在区别,这也是我们需要传入数组个数给函数作为参数的原因。个人认为,虽然我们常用指针这种方式来访问数组,但两者不能等同,数组仍然比地址所富含的信息多一些。
除了以上这种方式外,我们还可以利用首地址和尾地址来进行数组的访问。
#include <iostream>
const int ArSize = 8; //数组个数
int sum_arr(const int *, const int *); // 申明函数属性
int main()
{
using namespace std;
int cookies[ArSize] = {1,2,3,4,5,6,7,8}; //初始化数组
cout<<"Cookies size:"<<sizeof(cookies)/sizeof(cookies[0])<<endl;
int sum = sum_arr(cookies, cookies+ArSize); //函数调用
cout << "Total cookies eaten: " << sum << "\n";
system("pause");
return 0;
}
//求和函数
int sum_arr(const int * begin, const int * end)//输入参数为指针
{
const int * pt;
int total = 0;
for(pt = begin; pt != end; pt++)
total = total + *pt;
return total;
}
我们改变函数的输入参数为两个指针,两个指针的地址分别是数组的头地址以及数组尾地址之后的地址,在函数参数里我们用到了const变量,该变量可以保证该地址不会被恶意修改,可以保证数据的安全,即这里的数组数据我们只读,不可更改。
这里还需要强调一点,当一个数组我们声明为const类型,那么这个数组名传入的函数参数也需要用const修饰,给个例子看一下就理解了。
const int mounth[12] = {1,2,3,4,,5,6,7,8,9,10,11,12};
int arr_add(int arg[],int n); //valid 这个函数如果要用到mounth,是不可行的
所以这里建议,在函数参数还是尽量用const关键字来修饰一下,一来可以保护数据,二来这个函数既可以访问cosnt数据也可以访问非const数据,但是需要函数修改数据时,就不需要使用const了。