int sum_arr(int arr[],int n) {
int total = 0;
for(int i=0;i<n;i++){
total = total + arr[i];
}
return total;
}
方括号指出arr是一个数组,而方括号为空则表明,可以将任何长度的数组传递给该函数,n代表数组的长度。实际数组名就是指针,解释为其第一个元素的地址。
int arr[3] = {1,2,3};
int sum = sum_arr(arr,3);
arr是其第一个元素的地址,因此函数传递的是地址。由于数组的元素的类型为int,因此arr的类型必须是int指针,即int *。
int sum_arr(int *arr,int n);
其中用int *arr替换了int arr[] 。这证明这两个函数头都是正确的,因为在C++中,当且仅当用于函数头或函数原型中,int *arr和int arr[]的含义才是相同的。arr不仅指向int,还指向int数组的第一个int。在其他的上下文中,int *arr和int arr[]的含义并不相同。例如,不能在函数体中使用int arr[]来声明指针。
下面2个表达式是恒等的
arr[i] == *(ar+i);
&arr[i] == ar + i;
对于遍历数组而言,使用指针加法和数组下标是等效的。
但传递数组时,函数将使用原来的数组.参数传递了一个值,这个值被赋给一个新变量,但这个值是一个地址,而不是数组的内容。使用原始数据增加了破坏数据的风险,const限定符提供了解决这种问题的办法。
void show_array(const double ar[],int n);
指针ar指向的是常量数据。这意味着不能使用ar修改该数据,也就是说,可以使用像ar[0]这样的值,但不能修改。这并不是意味着原始数组必须是常量,而只是意味着不能在show_array( )函数中使用ar来修改这些数据。
使用数组区间的函数
int sum_arr(int *begin,int *end) {
int total = 0;
int *pt;
for(pt = begin;pt!=end;pt++){
total = total + *pt;
}
return total;
}
它将pt设置为指向要处理的第一个元素(begin指向的元素)的指针,并将*pt(元素的值)加入到total中。然后,循环通过递增操作来更新pt,使之指向下一个元素。只要pt不等于end,这一过程就将继续下去。当pt等于end时,它将指向区间中最后一个元素后面的一个位置,此时循环将结束。
调用
int arr[3] = {1,2,3};
int sum = sum_arr(arr,arr+3);
指针arr+3指向最后一个元素后面的一个位置(数组有3个元素,因此arr[3 − 1]是最后一个元素,其地址为
arr + 3 – 1。因此,区间[arr,arr+3]指定的是整个数组。
标签:arr,pt,int,sum,c++,函数参数,ar,数组 From: https://blog.51cto.com/u_3764469/6957604