wordpress站内搜索统计个人网站 备案
wordpress站内搜索统计,个人网站 备案,产品网上推广的方法有哪些,wordpress企业模板主题函数
引用式声明(函数原型):简称声明#xff0c;指定了函数的返回值类型、函数的接受参数类型#xff0c;这些叫函数的签名。与变量相同#xff0c;在函数声明时编译器不会为函数分配内存。函数的返回值类型在C99之前若不指明则默认隐式转换为为int类型#xff0c;但在C99…函数
引用式声明(函数原型):简称声明指定了函数的返回值类型、函数的接受参数类型这些叫函数的签名。与变量相同在函数声明时编译器不会为函数分配内存。函数的返回值类型在C99之前若不指明则默认隐式转换为为int类型但在C99之后必须指明函数的返回值类型。
定义式声明:简称定义提供了函数的具体实现。不同于变量的定义函数在定义时不会被分配内存在函数调用时候编译器在栈帧上为函数分配内存。相同函数可以有多个声明但只能有一个定义。
形参表:函数在声明或定义时的参数注意形参只是声明而非定义。形参表在函数声明时可省略形参标识符(形参名)但不能省略形参的数据类型
实参表:函数在调用时实际传入的值
函数调用:主调函数(主动调用其他函数的函数) 被调函数(被其他函数调用的函数) 函数的嵌套调用 函数的递归调用
形参只是声明而非定义
形参在函数调用时会被赋予实际参数的值而不是独立存在的变量。 形参的性质形参是函数定义中的参数在函数被调用时用于接收传递给函数的实际参数的值。形参在函数定义时就已经确定了它们的作用是接收参数值而不是独立的变量。因此形参在函数定义中只是参数的声明用于说明函数接收的参数类型和名称而不是独立的变量定义。 形参和实参的关系在函数调用时实际参数的值会被传递给形参形成了形参和实参的对应关系。形参会在函数执行期间使用实参的值但形参本身并不是独立的变量它们不会在函数调用之前分配内存空间或提供初始值。 形参在函数调用时赋值当函数被调用时实际参数的值会被赋给形参形成了形参和实参之间的对应关系。形参在函数执行期间会被视为局部变量但它们的值是由函数调用时的实际参数决定的而不是在函数定义时确定的。
因此形参在函数定义中只是参数的声明用于说明函数接收的参数类型和名称而不是独立的变量定义。形参的特殊性质使得它们只能被视为声明而不是定义。
栈帧
栈帧也称为活动记录、调用帧或过程帧是在函数调用时在函数调用栈中分配的一块内存区域用于存储函数的局部变量、参数值、函数返回地址以及其他与函数调用相关的信息。
每当函数被调用时都会在栈上创建一个新的栈帧栈帧在函数调用结束后会被销毁。栈帧的创建和销毁都是由编译器和执行环境来管理的。
典型的栈帧结构包括以下几个部分 局部变量区用于存储函数内部声明的局部变量这些变量在函数调用时被创建在函数返回时被销毁。 参数区用于存储函数调用时传递的参数值。 返回地址指向调用该函数的指令地址函数执行完毕后会返回到该地址继续执行。 旧的基址指针指向调用该函数的上一个栈帧的基址指针用于在函数返回时恢复上一个栈帧。 其他辅助信息如编译器生成的临时变量、寄存器保存等。
栈帧的存在使得函数调用能够有效地管理函数的局部数据和调用关系。每个函数调用都会在栈上创建一个新的栈帧形成一条栈链函数的局部变量和参数在各自的栈帧中进行存储保证了函数调用之间的隔离性。
从栈帧角度看函数调用
基址指针是在函数调用时用于帮助在栈上定位局部变量和参数的指针。基址指针指向当前函数栈帧的基址也就是栈帧中局部变量和参数的起始地址。
在一些体系结构中特别是x86架构下的C语言编程中通常使用基址指针和栈指针来进行栈操作。栈指针指向当前栈顶而基址指针则通常指向当前栈帧的底部。
基址指针的主要作用是
定位局部变量和参数通过基址指针加上偏移量来访问函数的局部变量和参数。帮助在函数调用中保存和恢复现场基址指针在函数调用时被保存在当前函数栈帧中在函数返回时用于恢复上一个函数栈帧的状态以便程序能够正确地返回到调用函数的位置。 在函数调用过程中基址指针和栈指针的变化和协作是确保函数调用能够正确执行的关键。
当一个函数被调用时会发生以下步骤 保存上一个栈帧的状态调用函数时当前函数的栈帧会被压入调用栈此时需要保存上一个栈帧的状态。这包括保存上一个栈帧的基址指针旧的基址指针和返回地址。这些信息保存在当前栈帧中以便在函数返回时能够恢复到上一个栈帧的状态。 分配当前函数的栈帧为当前函数调用分配一个新的栈帧包括存储局部变量、参数和其他与函数调用相关的信息。 传递参数将调用函数时传递的参数值复制到当前函数的栈帧中的参数区域。 执行函数体开始执行被调用函数的代码包括对局部变量的操作和执行其他语句。 返回地址更新当遇到函数返回语句时执行流程会返回到调用该函数的指令处。这时会使用保存在当前栈帧中的返回地址跳转到调用处继续执行。 恢复上一个栈帧状态在函数返回时需要恢复上一个栈帧的状态包括恢复旧的基址指针和返回地址以便继续执行上一个函数的代码。 释放当前栈帧当前函数执行完毕后它的栈帧会被销毁释放栈上的内存空间。
这样函数的调用就完成了。整个过程中栈帧的切换和状态保存使得程序能够正确地管理函数调用关系并保证函数调用的正确执行。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89975.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!