C++语法中,函数的参数不仅可以是基本类型的变量、对象名、数组名或引用,而且可以是指针。
**如果指针作为形参,在调用时实参将值传递给形参,也就是使实参和形参指针变量指向同一内存地址。**这样在子函数运行过程中,通过形参指针对数据值的改变也同样影响着实参指针所指向的数据值。
在C语言中,以指针作为函数的形参有三个作用:
①使实参与形参指针指向共同的内存空间,以达到参数双向传递的目的,即通过在被调函数中直接处理主调函数中的数据而将函数的处理结果返回其调用者。这个作用在C++中已经通过引用实现了。
②减少函数调用时数据传递的开销。这一作用在C++中有时可以通过引用实现,有时还是需要使用指针。
③通过指向函数的指针传递函数代码的首地址。
习惯上,如果函数体中不需要通过指针改变指针所指向对象的内容,应该在参数表中将其声明为指向常量的指针,这样使得常对象被取地址后也可以作为该函数的参数。
在程序设计中,当某个函数中以指针或引用作为参数都可以达到同样的目的时,使用引用会使程序可读性更好。
【例】读入3个浮点数,将整数部分和小数部分分别输出
void fun(float x, int* ip, float* fp)
{
*ip = static_cast<int>(x);//取x的整数部分
*fp = x - *ip;//取x的小数部分
}
int main()
{
cout << "输入3个浮点数:" << endl;
for (int i = 0; i < 3; i++)
{
float x,f;
int n;
cin >> x;
fun(x, &n, &f);
cout <<"第"<<i+1<<"个数的整数部分:" << n << " 小数部分:" << f << endl;
}
return 0;
}
运行结果:
结果分析:
程序中的fun函数采用了两个指针变量作为参数,主函数在调用过程中使用变量的地址作为实参。形实结合时,子函数的ip值就是主函数中的int型变量n的地址。因此,子函数中改变*ip的值,其结果也会直接影响主函数中变量n的值。fp和浮点数f也有类似的关系。
这个程序中,使用引用作为形参也可以达到同样的目的,将代码改写如下:
void fun(float x, int& ip, float& fp)
{
ip = static_cast<int>(x);//取x的整数部分
fp = x - ip;//取x的小数部分
}
int main()
{
cout << "输入3个浮点数:" << endl;
for (int i = 0; i < 3; i++)
{
float x,f;
int n;
cin >> x;
fun(x, n, f);
cout <<"第"<<i+1<<"个数的整数部分:" << n << " 小数部分:" << f << endl;
}
return 0;
}
运行结果: