C/C++ 子函数返回局部变量、指针 和改变指针指向

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yudejiao/article/details/53324856

1>子函数返回局部变量

例子1:


上面的简单程序,大家应该都知道应该会输出什么。是的,输出如下图:


引出的思考:子函数doubletimes()中的返回变量k是局部变量,返回到主函数后该变量超出了作用域,已经被销毁了,为什么主函数中的变量m还会等于20呢?

引出的结论:C语言中参数的传递(包括输入参数和返回参数)实质上都是传递的参数的拷贝。

在上面例子中,子函数返回值k=20,实际返回的不是变量k,而是会将变量k复制一份,返回副本。

2> 子函数返回局部指针

指针也是变量,只不过指针变量的值表示的是内存中的地址而已。所以例子1引出的结论在这里也适合指针变量

例子2:


虽然在子函数doubletimes()中返回的指针变量n在return后会“销毁”,但是它的副本会被返回到main()函数中,并赋值给指针变量k。

输出结果如下图:


k比n大4的原因是,上例中的变量是int类型的,我的编译环境决定了int类型占4个字节。

3> 通过子函数修改main函数的变量

例子3:


通过例子1,想一下上面例子会返回什么呢??

由于 参数传递只是副本的传递,那么传进子函数doubletimes()中的变量n不是main函数中的变量n,而是其副本。在子函数中修改副本的值,对main函数中的变量n是没有影响的。返回值如下图:


那么该如何在子函数中修改main函数中的变量呢??

例子4:


记住两点:指针也是变量;通过指针变量能间接访问其他变量并修改其值。

例4中的内存示意图如下图:


由上图可知:在子函数中也可返回main函数中的变量n,并可修改其值。程序出如下图:





4>通过子函数修改main()函数中指针变量

指针变量的值即指针所指向变量的地址。


例4的内存结构图如下图:


在子函数中可间接访问main函数中的指针变量n,从而改变其值,也就改变了指针n的指向了。

输出结果如下图:


总结:

想要在子函数中修改main函数中变量的值,需要传更高一级的变量到子函数。例如,改变普通变量的值,需要传一级指针;改变一级指针的值需要传二级指针等等。


展开阅读全文

没有更多推荐了,返回首页