思考时间 :假设使用一个数组记录一次聚餐中每个人吃了多少个甜饼,想求出此次家庭聚餐大家总共吃了多少个甜饼。
这个问题用到的是将数组元素累加,如果封装成函数,以后调用就会省事很多。
再封装函数时,要考虑函数接口所涉及的类型,因为最终需要返回的事消耗的甜饼总数,如果每个人消耗的甜饼均为整数,那么返回值为int
类型。然后函数体需要对数组中的元素进行累加,所以需要将数组名传递给它,同时还需传递数组长度len
。这里我们就需要将一个形参声明为数组名。
int sum(int arr[],int len)
大家再来思考一下,此处的 arr
是数组还是地址????
此处的arr
为一个指针!!!!!!!!!此处的int arr[]
其实对应着int * arr
。在C++中当且仅当在函数头或者函数原型中int arr[]和int * arr才具有相同的意义在函数体中,不能使用int arr[]来声明指针。
实现代码如下:
#include<iostream>
using namespace std;
#include<string >
int sum(int arr[],int len)
{
int sum=0;
for(int i=0;i<len;i++)
{
sum+=arr[i];
}
return sum;
}
int main()
{
int cookies[]={1,3,2,4,6,5,7,9,8};
int len=sizeof (cookies )/sizeof (cookies [0]);
cout<<"吃的甜饼总数为:"<<sum(cookies ,len)<<endl;
system ("pause");
return 0;
}
结果如下:
这里我们继续考虑一个问题:代码中sizeof (cookies)
和sizeof (arr)
的长度分别是多少?
首先可以确定的是cookies和arr指向的是同一个地址。但是这里sizeof (cookies)是指整个整个数组的长度36,而sizeof (arr)只是指针变量的长度4。所以数组长度必须显示传递!!!!
我们可以验证一下:
#include<iostream>
using namespace std;
#include<string >
int sum(int arr[],int len)
{
cout<<"sizeof (arr)的长度为:"<<sizeof (arr)<<endl;
return 0;
}
int main()
{
int cookies[]={1,3,2,4,6,5,7,9,8};
int len=sizeof (cookies )/sizeof (cookies [0]);
cout<<"sizeof (cookies )的长度为:"<<sizeof (cookies )<<endl;
sum(cookies ,len);
system ("pause");
return 0;
}
运行结果如下: