0
点赞
收藏
分享

微信扫一扫

c++数组作为函数参数

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]指定的是整个数组。

举报

相关推荐

0 条评论