C++中数组作为函数参数的使用说明

我们一般使用函数时,函数参数大多数都是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了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值