算法竞赛入门经典 第四章 学习笔记 1

算法竞赛入门经典 第四章 学习笔记 1

数组作为参数和返回值

因为把数组作 为参数传递给函数时,实际上只有数组的首地址作为指针传递给了函数。换句话说,在函数 定义中的int a[]等价于int *a。在只有地址信息的情况下,是无法知道数组里有多少个元素 的。正确的做法是加一个参数,即数组的元素个数
以数组为参数调用函数时,实际上只有数组首地址传递给了函数,需要另 加一个参数表示元素个数。

#include<iostream>
using namespace std;
int sum(int *a,int n)    //直接把参数a写成了int* a,暗示a实际上是一个地址 (函数名是一个地址)
{
	int res=0;
	for(int i=0;i<n;i++)
	{
		res+=a[i];
	}
	return res;
}
int main()
{
	int a[]={1,2,3,4};
	cout<<sum(a,4)<<endl;
	return 0;
}
#include<iostream>
using namespace std;
int sum(int a[],int n)
{
	int res=0;
	for(int i=0;i<n;i++)
	{
		res+=a[i];
	}
	return res;
}
int main()
{
	int a[]={1,2,3,4};
	cout<<sum(a,4)<<endl;
	return 0;
}

在函数调用时a 不一定非要传递一个数组

#include<iostream>
using namespace std;
int sum(int a[],int n)
{
	int res=0;
	for(int i=0;i<n;i++)
	{
		res+=a[i];
	}
	return res;
}
int main()
{
	int a[]={1,2,3,4};
	cout<<sum(a+1,3)<<endl;
	return 0;
}
/*
除了把数组首地址本身作为实参外,还可以利用指针(因为函数名是一个指针,所以a+1)加减法把其他元素的首地址传递给函数。
指针a+1指向a[1],即2这个元素(数组元素从0开始编号)。因此函数sum“看到”{2, 3, 4} 这个数组,因此返回9。一般地,若p是指针,k是正整数,则p+k就是指针p后面第k个元 素,p-k是p前面的第k个元素。
*/

而如果p1和p2是类型相同的指针,则p2-p1是从p1到p2的元素个数(不含p2)

#include<iostream>
using namespace std;
//先进行了一次指针减法,算出了从begin到end(不含end)的元素个数n,然 后再像前面那样把begin作为“数组名”进行累加。
int sum(int *begin,int *end)
{
	int n=end-begin;
	int res=0;
	for(int i=0;i<n;i++)
	{
		res+=begin[i];
	}
	return res;
}
int main()
{
	int a[]={1,2,3,4};
	cout<<sum(a,a+4)<<endl;
	return 0;
}
#include<iostream>
using namespace std;
int sum(int *begin,int *end)
{
	int res=0;
	for(int *p=begin;p!=end;p++)
	{
		res+=*p;
	}
	return res;
}
int main()
{
	int a[]={1,2,3,4};
	cout<<sum(a,a+4)<<endl;
	return 0;
}
//用一个新指针p作为循环变量,同时累加其指向的值
/*
声明了一个长度为10的数组a,则它的元素之和就是sum(a, a+10);若要计算a[i], a[i+1], …, a[j],则需要调用sum(a+i, a+j+1)。
*/


把数组作为指针传递给函数时,数组内容是可以修改的。因此如果要写一个“返回数 组”的函数,可以加一个数组参数,然后在函数内修改这个数组的内容。不过在算法竞赛中经常采取其他做法

猜你喜欢

转载自www.cnblogs.com/serendipity-my/p/12636056.html