《9.2 参数传递:指针作参数电子课件 计算机系统基础:C语言视角(RISC-V版).ppt》由会员分享,可在线阅读,更多相关《9.2 参数传递:指针作参数电子课件 计算机系统基础:C语言视角(RISC-V版).ppt(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、9.2 参数传递:指针作参数电子课件 计算机系统基础:C语言视角(RISC-V版)参数传递:参数传递:指针指针作参数作参数交换两个参数值的交换两个参数值的SwapSwap函数函数#include#include void Swap(int firstVal,int secondVal);void Swap(int firstVal,int secondVal);int main()int main()int valueA=3;int valueA=3;int valueB=4;int valueB=4;Swap(Swap(valueA,valueBvalueA,valueB););printf
2、(valueA=%d and valueB=%dn,valueA,valueB);printf(valueA=%d and valueB=%dn,valueA,valueB);void Swap(int firstVal,int secondVal)void Swap(int firstVal,int secondVal)int tempVal;int tempVal;tempVal=firstVal;tempVal=firstVal;firstVal=secondVal;firstVal=secondVal;secondVal=tempVal;secondVal=tempVal;SwapSw
3、ap函数函数01 01 Swap:Swap:addiaddisp,sp,-4sp,sp,-4#分配栈帧分配栈帧0202 swsws1,0(sp)s1,0(sp)#s1#s1(寄存器的保存)寄存器的保存)03030404 mvmvs1,a0s1,a0#tempVal=firstVal;#tempVal=firstVal;0505 mv mva0,a1a0,a1#firstVal=secondVal;#firstVal=secondVal;0606 mv mva1,s1a1,s1#secondVal=tempVal;#secondVal=tempVal;07070808 lw lws1,0(sp)
4、s1,0(sp)#恢复寄存器恢复寄存器s1s10909 addi addisp,sp,4sp,sp,40A0A ret retint main()int main()int valueA=3;int valueA=3;/s1/s1int valueB=4;int valueB=4;/s2s2Swap(Swap(valueA,valueBvalueA,valueB););void Swap(int firstVal,int secondVal)void Swap(int firstVal,int secondVal)/a0,a1/a0,a1 int tempVal;int tempVal;/s1
5、/s1tempVal=firstVal;tempVal=firstVal;firstVal=secondVal;firstVal=secondVal;secondVal=tempVal;secondVal=tempVal;指针指针实参实参以值的形式从调用函数以值的形式从调用函数传递到被调用函数传递到被调用函数要修改要修改实参实参,必须在调用函,必须在调用函数的活动记录中为数的活动记录中为实参实参分配分配空间空间通过访问存储它们的单元,修通过访问存储它们的单元,修改改实参实参指针及其相关运算指针及其相关运算交换两个交换两个变量变量的的NewSwapNewSwap函数函数#include#incl
6、ude void NewSwap(int*firstVal,int*secondVal);void NewSwap(int*firstVal,int*secondVal);int main()int main()int valueA=3;int valueA=3;/0 xBFFF FFEC/0 xBFFF FFEC int valueB=4;int valueB=4;/0 xBFFF FFE8/0 xBFFF FFE8 NewSwap NewSwap(&valueA,&valueB(&valueA,&valueB););printf(valueA=%d and valueB=%dn,value
7、A,valueB);printf(valueA=%d and valueB=%dn,valueA,valueB);void NewSwap(void NewSwap(int*firstValint*firstVal,int*secondValint*secondVal)/a0,a1/a0,a1 int tempVal;int tempVal;/s1/s1 tempVal=tempVal=*firstVal*firstVal;*firstVal *firstVal=*secondVal*secondVal;*secondVal *secondVal=tempVal;=tempVal;NewSwa
8、pNewSwap01 NewSwap:addisp,sp,-402sws1,0(sp)#寄存器寄存器s1的保存的保存0304lwt0,0(a0)#*firstVal05mvs1,t0#tempVal=*firstVal;06lwt1,0(a1)#*secondVal07swt1,0(a0)#*firstVal=*secondVal;08sws1,0(a1)#*secondVal=tempVal;090Alws1,0(sp)#恢复恢复s10Baddisp,sp,40Cret示例示例被调用函数被调用函数返回返回到调用到调用者后,是否可以通过指者后,是否可以通过指针修改针修改被调用函数的局被调用函数
9、的局部变量部变量?问题:打印结果是问题:打印结果是“x+1”x+1”的值的值1 1吗?吗?从从f f函数返回后,是否可函数返回后,是否可以修改以修改f f的局部变量的局部变量x?x?#includeint*f();voidg(int*);intmain()int*p=f();g(p);printf(%dn,*p);int*f()intx=0;int*fp=&x;returnfp;voidg(int*gp)inty3=0,1,2;*gp=*gp+1;运行时栈运行时栈f f函数,返回值为函数,返回值为&x&x,0 xBFFF FFE40 xBFFF FFE4g g函数中,函数中,*gp*gp的值不是的值不是x x,而是,而是y1!y1!野指针野指针f f函数返回的指针函数返回的指针fpfp,在,在f f函数返回后,所指的函数返回后,所指的局部变量局部变量x x已经不存在,指向已经不存在,指向x x的指针就成为野的指针就成为野指针(指针(Wild PointerWild Pointer)被分配到栈帧中的函数局部变量,在函数被分配到栈帧中的函数局部变量,在函数返回返回后后,不可不可再对其进行操作再对其进行操作将会使程序发生不可预知的错误将会使程序发生不可预知的错误