实参(argument)
形参(parameter)
形参名称和函数体中定义的任何变量都是局部变量。
1)使用函数
函数原型给编译器提供了为验证我们是否在正确使用函数而需要的基本信息。
double power(double value,int index);
double power(double,int);
2)按值传递机制
系统创建实参的副本,编译器把指定实参的副本存储在临时的内存区域中。在函数执行过程中,所有对形参的引用都被映射到这些临时的实参副本上。
函数运行结束,副本被抛弃。
3)给函数传递指针实参
当使用指针作为实参时,按值传递机制仍然像以前一样工作。但指针是另一个变量的地址,如果创建该地址的副本,则副本仍然指向相同的变量。以指针作为形参可以使函数处理调用者传递的实参。
4)给函数传递数组
还可以给函数传递数组,但这种情况下即使仍然使用按值传递的方法传递实参,系统也不会复杂被传递的数组。编译器将数组名转换为指针,指向数组头部的指针副本通过按值传递机制被传递给函数。这是十分有利的,因为复制大型数组非常耗时。但是在函数内可以修改数组的元素。因此数组是唯一不能被按值传递机制保护的类型。
double average(double array[],int count);//Function prototype
int main(void)
{
double values[]={1.0,2.0,3.0,4.0};
cout<<endl<<"average="<<average(values,(sizeof values)/(sizeof values[0]));
cout<<endl;
return 0;
}
double average(double array[],int count)
{
double sum=0.0;
for(int i=0;i<count;i++)sum+=array[i];
return sum/count;
}
5)给函数传递数组指针
double average(double* array,int count);//Function prototype
int main(void)
{
double values[]={1.0,2.0,3.0,4.0};
cout<<endl<<"average="<<average(values,(sizeof values)/(sizeof values[0]));
cout<<endl;
return 0;
}
double average(double* array,int count)
{
double sum=0.0;
for(int i=0;i<count;i++)sum+=*(array+i);
return sum/count;
}
6)编译器如何知道我们是在定义数组而非单个数组元素作为实参?
不能在函数定义或原型中写上单个数组元素作为形参。如果要接受单个数组元素实参的形参,将只有一个变量名,而接受数组的形参则不然。
7)给函数传递引用实参
将某个形参指定为引用,使用的方法不是按值传递,而是按引用传递。该机制消除了任何复制工作,允许函数直接访问调用函数中的实参。同时意味着,传递和使用指针时所需的取消引用操作也是多余的。
int incr10(int& num);//function prototype
int main(void)
{
int num=3;
int result=incr10(num);
return result;
}
int incr10(int& num)
{
}
8)使用const修饰符
可以给函数的形参使用const修饰符,以告诉编译器我们不想以任何方式修改这个形参。
int incr10(const int& num);//function prototype
int main(void)
{
int num=3;
int result=incr10(num);
return result;
}
int incr10(const int& num)
{
}