函数
6.17
实参向形参的值传递就是在栈区创建一个跟实参相同的变量,但是位置不同,函数调用完毕后形参会被销毁。
第一行表示表示创建变量p1,第二行表示创建新变量承接p1,
函数如果返回引用则不会创建新值,如果返回值,则返回的值与函数体语句中的变量不相同,会创建一个新的不同地址的变量进行返回。
如下一段代码,
当函数体语句为这样是 p2=20
第一次调用后p2.age=20,调用完毕返回了一个与p2值相同,地址不同的变量(拷贝p2形成的变量),之后每一次调用都会返回一个全新的变量,所以第二次调用的时候已经不是p2在调用函数了,而是被创造出来的与之前相同的变量(p3,p4,p5…)在调用函数了。
This是指向对象的指针,所以*this就是该对象。
当函数体语句如下时,返回p2
每次调用完函数之后都会返回p2,所以p2一直连加,最终p2=40
1、函数值传递
值传递中的形参不会影响实参,形参是跟实参的值相同的变量,且形参的储存位置在栈区。
2、地址传递
将实参的(&+变量名)地址传给函数,并用指针(数据类型+*+指针名)进行接收,此时不会在栈区创建新的变量,会改变实参。
void swap01(int *p1,int *p2)
{
int temp=*p1;
*p1=*p2;
*p2=temp;
}
int a = 10 , b=20;
swap01(& a , &b );//
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
3、引用???
该方法也会改变实参。同样也不会创造新的变量
void swap02(int &p1,int &p2)
{
int temp=p1;
p1=p2;
p2=temp;
}
int a = 10 , b=20;
swap02 ( a , b );//不写取址符
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
4、数组函数调用
- #include <iostream>
- #include <string>
- #include <algorithm>
- using namespace std;
- void Read(int *a, int &len)//使用指针
- {
- string str;
- cin >> str;
- int lens = str.size();
- for (int i = 0; i < lens; i++)
- {
- a[i] = str[i] - 48;
- }
- len = lens;
- reverse(a, a + len);
- }
- int a[500], a_len, b[500], b_len, ans[501];
- int main()
- {
- Read(a, a_len);//直接调用
- for (int i = 0; i < a_len; i++)
- {
- cout << a[i];
- }
- return 0;
- }