函数调用过程

2019-12-13  本文已影响0人  arthur_wang_73

函数调用是程序中经常使用的方法,好处不言而喻。
函数调用的基本原则是局部变量的概念。在主程序中使用的变量在函数中并不能使用,在函数中定义的变量在主程序中也不能使用。

函数结果输出的方式:

函数通过返回值来输出函数结果是基本的方法。

其他方式

直接在函数内部输出结果。(结果不需要给其他语句使用的情况)
全局变量
指针方式
数组,字符串,结构也是可以的。因为它们本质上都是指针。

要想很好的理解指针在函数返回的机制,可能需要了解一下函数调用的机制。

函数调用机制

函数调用操作包括从一块代码到另一块代码之间的双向数据传递和执行控制转移。数据传递通过函数参数和返回值来进行。另外,我们还需要在进入函数时为函数的局部变量分配存储空间,并且在退出函数时收回这部分空间。Intel 80x86 CPU为控制传递提供了简单的指令,而数据的传递和局部变量存储空间的分配与回收则通过栈操作来实现。

void swap(int * a, int *b)
{
int c;
c = *a; *a = *b; *b = c;
}

int main()
{
int a, b;
a = 16; b = 32;
swap(&a, &b);
return 0;
}

stack.jpg

在main运行时,程序需要记住四个变量的值,即a,b, &a, &b。堆栈中记录相关的变量的内存地址,这样可以方便计算机去寻址取值。
调用之后,主程序的状态信息进入堆栈记录。启用函数堆栈进行计算,函数堆栈记录主程序的堆栈地址以方便返回。
在数据传递过程中,通过参数和返回将数值进行传递。
在函数运行过程中主程序的内存不会释放。这就是通过传递指针的值给函数可以对主程序变量进行修改的原因。程序通过地址值来访问主程序的内存。
在函数程序运行过程中,主程序堆栈中记录的变量列表不能被访问(堆栈头已经修改啦)。这就是在函数中不能通过变量名进行修改的原因。

总结

函数调用过程中,主程序还在占用内存。但是由于堆栈信息不可用,就不能通过变量名来对主程序占用的内存空间进行操作了。
因此可以通过指针用内存地址直接访问。

上一篇 下一篇

猜你喜欢

热点阅读