函数中的参数类型及其用法
函数是程序中最基本的组成部分之一,函数有一些特殊的字符,能够帮助在将函数参数传递给函数时正确使用它们。函数参数类型是指函数定义时参数所声明的类型。这篇文章将讨论函数中的参数类型及其用法。
1. 值传递
在C++中,当函数使用独立的变量来传递数据时,只有该变量的值被传递到子程序中,在执行期间没有其他的依赖关系,这被称为值传递。值传递是参数传递机制的一种,它将实参的值传递给形参。在函数体内,形参用于存储实参的值,函数执行结束后它们被释放。这意味着,如果修改了形参的值,实参的值不会改变。
example:
#include <iostream>
using namespace std;
// 带有两个参数的函数
void swap(int x, int y)
{
int temp;
temp = x; /* 保存 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 x 赋值给 y */
return;
}
int main ()
{
// 局部变量声明
int a = 100;
int b = 200;
cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl;
// 调用函数来交换值
swap(a, b);
cout << "交换后,a 的值:" << a << endl;
cout << "交换后,b 的值:" << b << endl;
return 0;
}
输出:
交换前,a 的值:100 交换前,b 的值:200 交换后,a 的值:100 交换后,b 的值:200
在此示例中,函数swap()通过值传递调用时,交换了变量a和b的值,函数内进行的操作不会影响函数外的变量。这是因为,在函数中声明的参数是传递给函数的副本,所有的操作都是在副本上执行的。
2. 引用传递
引用传递也被称为地址传递。函数传递参数的引用就是传递参数的地址。
example:
#include <iostream>
using namespace std;
// 函数声明
void swap(int& x, int& y);
int main ()
{
// 局部变量声明
int a = 100;
int b = 200;
cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl;
// 调用函数来交换值
swap(a, b);
cout << "交换后,a 的值:" << a << endl;
cout << "交换后,b 的值:" << b << endl;
return 0;
}
// 函数定义
void swap(int& x, int& y)
{
int temp;
temp = x; /* 保存地址 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 x 赋值给 y */
return;
}
输出:
交换前,a 的值:100 交换前,b 的值:200 交换后,a 的值:200 交换后,b 的值:100
在上面的示例中,函数swap()通过引用传递调用时,交换了变量a和b的值。引用传递中,传递的是地址,因此在函数内中进行的操作将影响函数外的变量。这是因为,在函数中声明的参数是实参的地址,因此对形参的修改将传递到实参。
3. 指针传递
指针传递与引用传递类似,也是传递参数的地址。指针传递的方法比引用传递更灵活,因为指针可以指向任何类型的数据,而引用只能指向由它自己定义的类型。
example:
#include <iostream>
using namespace std;
// 函数声明
void swap(int *x, int *y);
int main ()
{
// 局部变量声明
int a = 100;
int b = 200;
cout << "交换前,a 的值:" << a << endl;
cout << "交换前,b 的值:" << b << endl;
// 调用函数来交换值
swap(&a, &b);
cout << "交换后,a 的值:" << a << endl;
cout << "交换后,b 的值:" << b << endl;
return 0;
}
// 函数定义
void swap(int *x, int *y)
{
int temp;
temp = *x; /* 保存地址 x 的值 */
*x = *y; /* 把 y 赋值给 x */
*y = temp; /* 把 x 赋值给 y */
return;
}
输出:
交换前,a 的值:100 交换前,b 的值:200 交换后,a 的值:200 交换后,b 的值:100
上面的示例中func()函数具有两个指向int类型变量的指针参数,在函数内部对变量进行交换,从而使变量得到互换。
在此示例中,函数swap()通过指针传递调用时,交换了变量a和b的值,函数内进行的操作将影响函数外的变量。这是因为,在函数中声明的参数是实参的地址,因此在函数中对指针的修改将影响实参。
总结:
值传递:
- 仅把实参的值传入到函数中,在执行期间是独立的,
- 如果在函数中对形参做修改,实参不受影响。
引用传参:
- 将实参的地址传入到函数中,在执行期间是共享的,有别名的作用。
- 如果在函数中对形参做修改,则实参也会被修改。
指针传递:
- 将实参的地址传入到函数中,在执行期间是共享的,有别名的作用。
- 函数中对指针所指内存存储单元的操作改变了该内存单元的内容,
- 同时实参的值也改变了。
