在第5章5.4节中介绍过可以用数组名作函数的参数。前面已经多次强调: 数组名代表数组首元素的地址。用数组名作函数的参数,传递的是数组首元素的地址。很容易推想: 用指针变量作函数形参,同样可以接收从实参传递来的数组首元素的地址(此时,实参是数组名)。下面将第5章5.4节中的例5.7程序改写,用指针变量作函数形参。
例6.6 将10个整数按由小到大的顺序排列。
在例5.7程序的基础上,将形参改为指针变量。
#include <iostream>
using namespace std;
int main( )
{void select_sort(int *p,int n); //函数声明
int a[10],i;
cout<<″enter the originl array:″<<endl;
for(i=0;i<10;i++) //输入10个数
cin>>a[i];
cout<<endl;
select_sort(a,10); //函数调用,数组名作实参
cout<<″the sorted array:″<<endl;
for(i=0;i<10;i++) //输出10个已排好序的数
cout<<a[i]<<″ ″;
cout<<endl;
return 0;
}void select_sort(int *p,int n) //用指针变量作形参
{int i,j,k,t;
for(i=0;i<n-1;i++)
{k=i;
for(j=i+1;j<n;j++)
if(*(p+j)<*(p+k)) k=j; //用指针法访问数组元素
t=*(p+k);*(p+k)=*(p+i);*(p+i)=t;
}
}
运行情况与例5.7相同。

本例与例5.7在程序的表现形式上虽然有不同,但实际上,两个程序在编译以后是完全相同的。C++编译系统将形参数组名一律作为指针变量来处理。
实际上在函数调用时并不存在一个占有存储空间的形参数组,只有指针变量。
实参与形参的结合,有以下4种形式:
实 参 形 参
数组名 数组名 (如例5.7)
数组名 指针变量 (如例6.6)
指针变量 数组名
指针变量 指针变量
在此基础上,还要说明一个问题: 实参数组名a代表一个固定的地址,或者说是指针型常量,因此要改变a的值是不可能的。如
a++; //语法错误,a是常量,不能改变
而形参数组名是指针变量,并不是一个固定的地址值。它的值是可以改变的。在函数调用开始时,它接收了实参数组首元素的地址,但在函数执行期间,它可以再被赋值。如
f(array[],int n)
{ cout<<array; //输出array[0]的值
array=array+3; //指针变量array的值改变了,指向array[3]
cout<<*arr<<endl; //输出array[3]的值
}
评论