一:传值和传址
传值:把A的数值传到B,改变B,A不会跟着变,B存的是跟A一样的值;随着函数的结束,局部变量也会被释放。
传址:把A的地址传到B,改变B,A同时跟着变,B存的只是A的地址(类似电脑的快捷方式)。
对于函数之间传递地址:
传递地址就是把箱子(变量)的地址传递过去, 这时候要注意我们的形参和实参用的是同一个地址, 也就是形参中的箱子中存放的是实参的地址, 这样操作形参就相当于操作实参! 所以两个数交换的例子又会被提到, 很经典! 我们用这个例子来看(例子以及运行结果):
分析:传值,相当于实参给被调函数形参赋值,拷贝了一份数据,伴随着函数的结束,形参会被释放,实参的值也不会得到改变
转址操作:
分析:相当于在被调函数中,形参是指向实参的指针,对指针的操作相当于,对实参的操作,所以实参的值会改变。
在c++中,还有一种技术叫引用&,相当于给变量起一个别名,对形参的操作相当于对实参的操作,所以也可以改变实参的值。
总结:在函数外部想要改变实参的值,可以通过传地址,或者运用引用技术。
二、引用 和解引用
*和&:一个是解引用一个取地址;
"解引用",我倒觉得可以从另一个角度理解,"*"的作用是引用指针指向的变量值,引用其实就是引用该变量的地址,"解"就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为"解引用"。例如:*p = 100,p指向100的地址,解引用*p等于p指向地址的变量值,即*p=100叫做解引用。
在变量声明中的"*"和表达式中的"*"意义是不一样的,变量声明中的"*"意味着定义一个存放地址的指针变量,而表达式中的"*"表示间接存取指针变量所指向变量的值
三、函数的调用
第一步:函数调用
1、将函数调用语句下一条语句的地址保存到在栈中,以便函数调用完成后返回。(将函数放到栈空间中称为压栈)。
2、对实参表从后向前,一次计算出实参的值,并且将值压栈。
3、跳转到函数体处。
第二步:函数体执行
4、如果函数体中定义了变量,将变量压栈
5、将每一个形参以栈中对应的实参值取代,执行函数体的功能体。
6、将函数体中的变量、保存到栈中的实参值,依次从栈中取出,释放栈空间(出栈)。
第三步:返回
7、返回过程执行的是函数体中的return语句。其过程是从栈中取出刚开始调用函数时压入的地址,跳转到函数的下一条语句。当return语句不带有表达式时,按照保存的地址返回,当return语句带有表达式时,将计算出的return表达式的值保存起来,然后再返回。