C++编程入门 互动版

数组名作为函数参数

上一节我们简单提过函数参数。在函数声明中使用的参数是形参,而函数调用时的参数叫实参。实参是用来给形参赋值的。上一节介绍了变量、指针、引用都可以作为函数参数,另外数组元素也可以作为实参,用法与变量相同。这节我们讲数组名作为函数参数的三种情况。

形参和实参都用数组

#include <iostream>
using namespace std;
int max_array(int a[],int n);
void main()
{
    int a[10],i=0;
    cout<<"请输入10个整数:"<<endl;
    while(i<10)
    {
        cin>>a[i];
        i++;
    }
    int max=max_array(a,10);
    cout<<"max="<<max<<endl;
}
int max_array(int a[],int n)
{
    int max=a[0];
    for(int i=1;i<n;i++)
    {
        if(a[i]>max)
           max=a[i];
    }
    return max;
}

上例中,第3行的函数声明部分的形参以及第13行函数调用部分的实参都用到了数组。下面介绍下要点:

1.实参用函数名,形参用数组。形参在数组名后面跟一个[],表明是数组,[]里面可以加常量,说明数组的长度。例如 int a[5],但这样就限定了数组长度只能为5。为了解除这个限制,[]内也可以不指定数组长度,而用另一个形参传递数组元素的个数,如上例。

2.形参的数组和实参的数组都是指的相同的内存空间,例如上例如果在函数max_array中加入操作a[0]=100;那么实参数组的第0个元素的值将变成100。

形参用指针,实参用数组或指针

C++中数组的名字是一个指针常量,它只能指向数组首元素。形参可以用指针,而实参可以用数组或指向数组首元素的指针。再用上例做说明,函数调用不变,只改变函数的声明和定义,下面列出了改变的部分:

int max_array(int *p,int n);
int max_array(int *p,int n)
{
    int max=p[0];
    for(int i=1;i<n;i++)
    {
        if(p[i]>max)
           max=p[i];
    }
    return max;
}

形参用引用,实参用数组名

注意引用定义时必须要初始化,所以这种情况首先要先定义一个数组类型,才能再形参中建立一个数组的引用。继续用上面的例子:

#include <iostream>
using namespace std;
typedef int array[10];
int max_array(array & a,int n);
void main()
{
    array a;
    int i=0;
    cout<<"请输入10个整数:"<<endl;
    while(i<10)
    {
        cin>>a[i];
        i++;
    }
    int max=max_array(a,10);
    cout<<"max="<<max<<endl;
}
int max_array(array &a,int n)
{
    int max=a[0];
    for(int i=1;i<n;i++)
    {
        if(a[i]>max)
           max=a[i];
    }
    return max;
}

这里解释下typedef语句,它是C++的类型定义符,这里的意思是把长度为10的整型数组定义为array类型。第7行建立的array类型的变量a就是长度为10的整型数组。

参数的默认值

形参有默认值,那么就是说调用时没有实参来传递值的话,形参使用默认的值进行初始化。例如声明:int func(int a, int b=2,int c=10);这样参数b默认为2,参数c默认为10,调用时可以只传递一个参数a,也可以值传递a和b,或者a、b和c都用实参传递值。使用默认值要注意:

1.形参中指定默认值的参数放在参数列表的最后面,这样调用时才不会出现混乱。

2.调用时,给定的实参将取代默认值,如果没给定实参才使用默认值。

3.函数的声明与定义分开时,若形参有默认值,声明部分必须加入默认值的说明。若没有函数的声明,默认值那就写在函数的定义里面呗。

在右侧代码框中编写程序:设计一个最多可以求4个正整数的最大值的函数,采用默认参数。