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函数中变量的值,需要传更高一级的变量到子函数。例如,改变普通变量的值,需要传一级指针;改变一级指针的值需要传二级指针等等。
|