C++学习随笔之(二)参数传递

二、参数传递

        1、形参与实参

              在函数调用时,会为形参分配内存空间,并用实参的值为其赋值,也就是说形参与实参并不是同一段内存空间,值传递时,对形参的修改不会应用到实参。

#include<iostream>
using namespace std;
void print(int);

int main(){
	int n = 2;
	cout<<"地址: "<<&n<<endl;
	cout<<"数值:"<<n<<endl;
	print(n);
	return 0;

}

void print(int n){
	cout<<"地址: "<<&n<<endl;
	cout<<"数值:"<<n<<endl;
}

             

         2、三种参数传递方式

               1)值传递

                   对形参的修改不会影响到实参

#include<iostream>
using namespace std;
void change(int,int);

int main(){
	int x = 2,y = 3;
	cout<<"交换前:x="<<x<<",y="<<y<<endl;
	change(x,y);
	cout<<"交换后:x="<<x<<",y="<<y<<endl;

	return 0;
}

void change(int m,int n){
	int temp;
	temp = n;
	n = m;
	m = temp;
}
                 输出结果为

                    交换前:x=2,y=3
                    交换后:x=2,y=3


               2)指针传递

                   要想用被调函数改变调用函数中的变量值,应使函数中的操作直接作用在调用函数的变量上,要达到此目的,一个有效的途径是使用指针传递。此时操作的是指针所指向的地址的存储内容,这里的形参是指针,指向的内容与实参指向的内容相同,所以修改其指向的内容的值,实参也会被修改。

#include<iostream>
using namespace std;
void change(int *,int *);

int main(){
	int x = 2,y = 3;
	cout<<"交换前:x="<<x<<",y="<<y<<endl;
	change(&x,&y);
	cout<<"交换后:x="<<x<<",y="<<y<<endl;

	return 0;
}

void change(int *m,int *n){
	int temp;
	temp = *n;
	*n = *m;
	*m = temp;
}

                   输出结果为

                      交换前:x=2,y=3
                      交换后:x=3,y=2


               3)引用传递

                   使用引用传递时,不会再为形参分配内存空间,所以此时形参就是实参自身,对形参的任何操作本质上就是对实参的操作。通过输出实参x和形参m的地址可以看出二者对应同一段内存。

#include<iostream>
using namespace std;
void change(int &,int &);

int main(){
	int x = 2,y = 3;
	cout<<"变量x的地址是:"<<&x<<endl;
	cout<<"交换前:x="<<x<<",y="<<y<<endl;
	change(x,y);
	cout<<"交换后:x="<<x<<",y="<<y<<endl;

	return 0;
}

void change(int &m,int &n){
	int temp;
	temp = n;
	n = m;
	m = temp;
	cout<<"形参m的地址是:"<<&m<<endl;
}

                   输出结果为

                      变量x的地址是:0012FF60
                      交换前:x=2,y=3
                      形参m的地址是:0012FF60
                      交换后:x=3,y=2

       3、关于引用

             引用就是别名,char的长度与char&的长度相同,对一个变量的操作与对该变量的引用的操作是等效的。

            当返回类型为引用时,要求返回的变量不会因为函数的结束而消除,即返回的内容需要存在内存中。例如:

int& multiply(int m,int n){
	int * a = new int;
	*a = m * n;
	return *a;
}
               *a是堆中的内存,不会因为函数调用结束而被消除,但是不要忘记对a指向的内存的释放。

你可能感兴趣的:(C++学习随笔之(二)参数传递)