关于函数参数的传递方式
传值参数:
实际参数的值被复制到由函数开辟的内存空间中,成为形参的初始值。完成参数值传递之后,函数体中的语句对形参的访问、修改都是在这个标识对象上操作的,与实际参数无关。
实例:
#include<iostream> #include<cstring> using namespace std; void swap(int ,int); int main() { int a, b; cin >> a >> b; cout << "a=" << a << " b=" << b << endl; swap(a, b); cout << "a=" << a << " b=" << b << endl; system("pause"); } void swap(int a, int b) { int temp = a; a = b; b = temp; cout << "a=" << a << " b=" << b << endl; }
输出结果:
理解:输入4,5,赋给a,b。调用函数swap,把a,b的值传递给函数中的形参,在swap函数中,输出交换后的形参的值。然后再main函数中输出a,b的值,发现a,b实际上并没有交换值,这是因为swap函数只对形参进行操作。
指针参数:
指针传递本质上和值传递差不多,实际上是把实际的指针参数传递给函数中创建的形参指针。不同的地方在于,指针传递的情况时,可以通过再函数中通过形参指针的间址访问对实际变量做出更改,这是值传递无法做到的。
代码:
#include<iostream> #include<cstring> using namespace std; void swap(int *, int *); int main() { int a, b; cin >> a >> b; cout << "a=" << a << " b=" << b << endl; swap(&a, &b); //把a,b的地址传递给swap函数 cout << "a=" << a << " b=" << b << endl; system("pause"); } void swap(int *p, int *q) { int temp = *p; //通过指针简直访问,交换a,b的值 *p = *q; *q = temp; }
引用参数:
与以上两者不同的是函数调用时,形式参数不需要开辟新的存储空间,形式参数名作为引用(别名)绑定与实际参数表示的对象上。执行函数体时,对形参的操作就是对实参对象操作。
代码:
#include<iostream> #include<cstring> using namespace std; void swap(int &, int &); int main() { int a, b; cin >> a >> b; cout << "before swaping: "; cout << "a=" << a << " b=" << b << endl; swap(a, b); //实际参数是整形变量名 cout << "after swaping: "; cout << "a=" << a << " b=" << b << endl; system("pause"); } void swap(int &p, int &q) //形式参数是整形引用 { int temp = p; //通过名访问,交换a,b的值 p = q; q = temp; }
使用const引用参数:
#include<iostream> #include<cstring> using namespace std; void swap(const int &,const int &); int main() { int a = 2, b = 55; cout << a << " " << b << endl; swap(a, b); cout << a << " " << b; } void swap(const int &a, const int &b) { int temp = a; a = b; //非法操作a所绑定的对象被约束为只读,无法通过别名对该对象进行修改 b = temp; }
与上述类似,使用const关键字约束对指针变量所指向对象的访问,这种指针称为指向常量指针。
如:
int a=2,b=3;
const int *p1=&a; //声明一个指向常量的指针并给指针初始化
const int *p2;
p2=&b; //可以通过,因为指向常量的指针只对指针所指向的对象进行约束,并不对指针本身进行约束,所以可以先声明,后赋值
*p1=3; //非法,无法通过p1间接对a进行修改
a=3; //合法,a是int型变量,可以修改