指针入门(四)

指针与函数:函数用来操作数据,改变程序的运行状态。指针用来根据地址访问变量,函数名称本身也是地址,因此你将函数和指针的结合,就能够实现将复杂数据用指针传递和用指针返回,达到动态控制函数执行流的目标。

函数和指针的结构,需要通过程序栈的作用。函数和指针的结构主要有两种方式:(1)将指针作为参数,传递给函数,通过函数实现数据的修改,避免复制大量的数据,提高效率。(2)使用函数指针,函数名表示本身就是函数的地址,不过函数指针还是为程序执行流提供了新的可能。

一、基本概念:

1、程序的堆栈:堆和栈不是同一个概念,堆是heap,栈是stack,学过数据结构的同学对栈很熟悉。

两者的共同点:都是函数的执行区域,二者共享一块内存区域

两者的不同点:(11)栈通常占用共享区域的下部,因此FILO是其基本访问特征,栈是往上生长的;

(12)栈内容一般不会清除,但可能会被另外的栈的内容覆盖;

(13)栈空间往往是系统管理的,无需用户自己关心;

(21)堆通常占用共享区域的上部,因此堆上往下生长的;

(22)堆内容一般需要用户自行清楚,否则就会成为内存泄漏的元凶;

(23)堆空间往往是用户自己申请的,使用结束后需要自行进行释放;

2栈帧的组织:函数调用过程中,往往借助与栈存储调用函数的临时现场,每个函数都会有一个单元,这个单元通常被称为栈帧。栈帧中往往存放着函数参数和局部变量,与具体的函数是一一对应的。这也是为什么局部变量可以重名,名称虽然一样,但是不是在一块区域,依然可以保证地址不同。

栈帧的内容组织:(1)调用函数的返回地址,这是程序能够调用函数后正确返回的关键

(2)函数的返回值:被调用函数如果有返回值,也需要预留返回值的存储空间

(3)局部数据存储:局部变量的内存空间

(4)参数存储:为函数参数预留的空间

(5)栈指针和基指针:运行系统用来管理栈的指针

原文地址:https://www.cnblogs.com/guochaoxxl/p/6823174.html