zoukankan      html  css  js  c++  java
  • 算法竞赛入门经典 第四章 学习笔记 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)。
    */
    


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

  • 相关阅读:
    CVSps 3.8 发布,CVS 资料库更改收集
    Cobra WinLDTP 3.0 发布,GUI 自动化测试
    SolusOS 2 Alpha 6 发布,桌面 Linux 发行
    微软 Windows Phone 8 原创应用大赛起航
    JAVA削足适履适应RESTful设计
    如何撰写编程书籍
    Synbak 2.1 发布,系统备份工具
    LibreOffice 4.0 RC1 发布,支持火狐兼容主题
    Rails 3.2.11 发布,修复关键安全问题
    haveged 1.7 发布,随机数生成器
  • 原文地址:https://www.cnblogs.com/serendipity-my/p/12636056.html
Copyright © 2011-2022 走看看