首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ this指针:用于在成员函数中指向调用该函数的对象

C++中this指针是一个指向当前对象的指针。在成员函数中,可以使用this指针来访问调用该函数的对象的成员变量和成员函数。...一、定义和使用this指针 this指针是在成员函数内部定义的一个常量指针。它存储了当前对象的地址,可以通过它访问当前对象的成员变量和成员函数。...函数内部,返回的是指向调用该函数的对象的指针。...这里使用了*this来访问调用该函数的对象。 三、作为函数参数的this指针 this指针也可以作为函数参数传递。这种情况下,可以在函数内部访问其他对象的成员变量和成员函数。...在getName函数内部,使用了this指针访问调用该函数的对象的成员变量name。

26140
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )

    文章目录 一、函数形参使用推荐方法 二、完整代码示例 一、函数形参使用推荐方法 ---- 在函数中 , 形参 中的 指针变量 , 不建议直接使用 ; 推荐 在 函数中 , 定义 局部 指针变量 , 接收...形参中的 指针变量 , 具体操作的是 函数中 定义的 局部指针变量 ; 直接使用 *to_tmp++ 样式的代码 , 会改变指针指向 , 有可能会导致错误 , 一旦出错 , 根本无法排查 ; 如果 将...数组首地址 的 常量指针 的 指针指向 进行修改 , 直接就报错了 ; 函数形参 的 值 , 不要轻易进行改变 , 因此一般函数的形参 , 都定义为 const char * 指针常量 类型 ; 引入...辅助 局部变量 , 接收 函数 形参变量 ; 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 ; 代码示例 : /* * 实现字符串拷贝 ( 实现了模块化 ) * 将 from...指针指向的字符串 拷贝到 to 指针指向的字符串换 */ void str_copy(char *from, char *to) { // 使用局部变量 接收 形参 char *from_tmp

    1.1K10

    函数指针数组在实现转移表时的应用:以计算器为例

    函数指针数组         函数指针数组是C语言中一种数据结构,它由一系列指向函数的指针组成。...在C语言中,函数名代表函数的地址,因此可以创建一个数组来存储这些地址(即函数指针),然后通过索引访问并调用相应的函数。         ...函数指针数组通常用于实现转移表或分派表,这有助于根据输入或其他条件动态选择要执行的函数。例如,在一个计算器程序中,可以根据用户输入的操作符(如加、减、乘、除)来调用相应的数学运算函数。...具体来说,转移表的工作原理是: 定义一系列相关的函数:这些函数通常完成类似的任务,但行为根据某个特定条件有所不同。 创建一个函数指针数组:数组中的每个元素都是一个指向上述函数的指针。...这样做的好处是,当需要添加新的操作时,只需添加一个新的函数并将其地址添加到转移表中,而不需要修改现有的条件分支逻辑。

    11310

    汇编和栈

    当一个函数序言完成设置时,RBP 的内容将指向堆栈帧下面的前一个 RBP 注意:当您通过单击 Xcode 中的帧或使用 LLDB 跳到另一个堆栈帧时,RBP 和 RSP 寄存器都将更改值以对应于新的帧!...push 递减堆栈指针(请记住,因为堆栈向下增长),然后存储到新 RSP 指针所指向的内存地址里面。 push 指令后,最新推送的值将位于 RSP 指向的地址。...当一个函数需要六个以上的参数时,需要使用堆栈。 注意:当将大型结构传递给函数时,可能还需要使用堆栈。...第二行说 “将 0x8 放入 RSP 所指向的内存地址加 0x8。” 等等。 这会将值放入堆栈。但是请注意,没有使用 push 指令显式推送这些值,这会减少 RSP 寄存器。这是为什么?...例如,单击 viewDidLoad 堆栈框架并滚动到顶部。观察已创建多少暂存空间: 看看一个变量指向的值…… 它现在肯定不能保持 0x1 的值。为什么一个引用一个看似随机的值?

    3.7K20

    【数据结构】线性表(七)堆栈:链式栈及其基本操作(初始化、判空、入栈、出栈、存取栈顶元素、清空栈);顺序栈与链式栈之比较

    Stack 结构体用于表示堆栈,只包含一个指向堆栈顶部节点的指针 top。 3....创建一个新的节点 newNode: 将传入的值 value 赋给 newNode 的 data 成员; 将 newNode 的 next 指针指向当前堆栈的顶部节点; 更新堆栈的 top 指针为...接下来,通过连续调用 push 函数,将值 10、20 和 30 压入堆栈。 使用 peek 函数查看堆栈的顶部元素。 使用 pop 函数两次弹出堆栈的元素。...使用 isEmpty 函数判断堆栈是否为空。 调用 clear 函数清空堆栈中的所有元素。 再次使用 isEmpty 函数判断堆栈是否为空。 10...."Yes" : "No"); return 0; } 四、 顺序栈与链式栈的比较   在空间复杂性上,顺序栈在创建时就申请了数组空间,若栈经常处于不满状态将造成存储空间的浪费;链式栈所需空间是根据需要随时申请的

    32810

    堆栈基础(一)

    这里的堆栈和数据结构里的栈抽象数据类型是不同的,堆栈即运行时栈在系统层上(由硬件直接实现) 处理子过程调用;堆栈抽象数据类型通常用于实现依赖后进先出操作的算法,一般使用高级语言如c++/java等编写。...三个寄存器 函数状态主要涉及三个寄存器 rsp/esp/sp:栈指针寄存器,其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶 rbp/ebp/bp:基址指针寄存器,其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部函数栈帧...push / pop操作 运行时栈是有cpu直接管理的内存数组, 它使用连个寄存器,ss和esp(32是esp,16位是sp,64位是rsp), ss寄存器存放的段地址,esp是堆栈指针寄存器,指向最后压入到堆栈上的数据...栈帧的调整过程: 在main函数调用func_A的时候,首先在自己的栈帧中压入函数返回地址; 然后为func_A创建新栈帧并压入系统栈,在func_A调用func_B的时候,同样先在自己的栈帧中压入函数返回地址...; 然后为func_B创建新栈帧并压入系统栈,在func_B返回时,func_B的栈帧被弹出系统栈,func_A栈帧中的返回地址被“露”在栈顶,此时处理器按照这个返回地址重新跳到func_A代码区中执行在

    75160

    5.10 汇编语言:汇编过程与结构

    在通常情况下ESP是可变的,随着栈的生成而逐渐变小,而EBP寄存器是固定的,只有当函数的调用后,发生入栈操作而改变。执行PUSH压栈时,堆栈指针自动减4,再将压栈的值复制到堆栈指针所指向的内存地址。...被调用函数从栈中弹出参数并执行,然后将返回值存储在寄存器中,最后通过跳转返回到调用函数。局部变量也可以通过在栈中分配内存来创建。在函数开始时,可以使用push指令将局部变量压入栈中。...在函数结束时,可以使用pop指令将变量从栈中弹出。由于栈是后进先出的数据结构,局部变量的创建可以很方便地通过在栈上压入一些数据来实现。...在使用堆栈传参和创建局部变量时,需要谨慎考虑栈指针的位置,并确保遵守调用约定以确保正确地传递参数和返回值。...在使用USES和ENTER指令时,需要了解这些指令在具体的平台上的支持情况,以及它们适用的调用约定。通常情况下,在函数开头,我们将使用ENTER创建堆栈帧,然后使用USES指定需要保护的寄存器。

    47120

    5.10 汇编语言:汇编过程与结构

    执行PUSH压栈时,堆栈指针自动减4,再将压栈的值复制到堆栈指针所指向的内存地址。 执行POP出栈时,从栈顶移走一个值并将其复制给内存或寄存器,然后再将堆栈指针自动加4。...被调用函数从栈中弹出参数并执行,然后将返回值存储在寄存器中,最后通过跳转返回到调用函数。 局部变量也可以通过在栈中分配内存来创建。在函数开始时,可以使用push指令将局部变量压入栈中。...在函数结束时,可以使用pop指令将变量从栈中弹出。由于栈是后进先出的数据结构,局部变量的创建可以很方便地通过在栈上压入一些数据来实现。...在使用堆栈传参和创建局部变量时,需要谨慎考虑栈指针的位置,并确保遵守调用约定以确保正确地传递参数和返回值。...在使用USES和ENTER指令时,需要了解这些指令在具体的平台上的支持情况,以及它们适用的调用约定。通常情况下,在函数开头,我们将使用ENTER创建堆栈帧,然后使用USES指定需要保护的寄存器。

    22520

    初识函数栈帧的创建与销毁(笔记)

    栈指针(SP):栈是一种后进先出(LIFO)的数据结构,在函数调用期间使用的栈在内存中通常是由相邻的内存单元组成的。(SP)是指向当前栈顶的内存地址,通常在程序运行时自动维护。...EBP保存了调用函数时的堆栈顶部地址,通过维持这个固定的堆栈框架,可以方便地通过相对偏移访问不同的局部变量。 3.栈顶指针(ESP):ESP寄存器用于跟踪和管理堆栈的当前顶部地址。...它在函数执行期间被使用来管理局部变量、函数参数、内部临时数据等。当函数调用另一个函数时,调用者会将一些数据(如函数参数)压入堆栈中,ESP寄存器会随之向下移动,指向新的堆栈顶部。...一些能解释的问题: 1.局部变量是怎么创建的? 首先为函数分配好栈桢空间,栈桢空间里初始化一部分的空间之后, 然后给局部变量在栈桢中分配一点空间 2.为什么局部变量不初始化时值是随机值?...当调用函数时,在调用之前,用push把参数从右向左压栈, 当进入形参函数时,在函数的栈桢里通过指针偏移量找到形参 4.形参和实参是什么关系?

    21510

    汇编角度看函数堆栈调用

    下面以主函数调用求和函数分析函数堆栈调用 带着以下一个问题来探索: (1)形参的内存空间的开辟和清理是由调用方还是由被调用方执行的? (2)主函数调用函数结束后,主函数从哪里开始执行?...esp:专门用作堆栈指针,被形象的称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,esp就越来越小。在32位平台上,esp每次减少4个字节。 ebp:堆栈的栈底指针。...所以栈顶指针向上(低地址)移动76个字节,为什么会移动76个字节。我们可以认为,编译认为主函数栈帧开辟76个字节大小完全足够使用。...(2)跳转 如何确定call指令是否执行了上述的动作,我们使用反汇编代码进行调试。 黄箭头表示此条指令还未执行,那么我们查看此时栈底指针esp的地址,查看内存中的内容。...所以形参内存是由调用方清理的。 2.将eax寄存器中的值`30`放入[ebp-0Ch]指向的四字节内存块中。 到这里,函数堆栈调用的过程就完全展示出来了。

    67420

    详解CC++堆栈的工作机制

    ESP寄存器总是指向堆栈的栈顶,执行PUSH命令向堆栈压入数据时,ESP减4,然后把数据拷贝到ESP指向的地址;执行POP命令时,首先把ESP指向的数据拷贝到内存地址/寄存器中,然后ESP加4。...在函数开始时,对应的堆栈帧已经完整地建立了(所有的局部变量在函数帧建立时就已经分配好空间了,而不是随着函数的执行而不断创建和销毁的);在函数退出时,整个函数帧将被销毁。 5....事实上,调试器正是这么做的,这也就是为什么调试时我们查看函数调用顺序时总是说“查看堆栈”了。...返回值是如何传递的 堆栈帧建立起后,函数的代码真正地开始执行,它会操作堆栈中的参数,操作堆栈中的局部变量,甚至在堆(Heap)上创建对象,balabala…....如果显式地把类成员函数声明为使用__cdecl或者__stdcall,那么,将采用__cdecl或者__stdcall的规则来压栈和出栈,而this指针将作为函数的第一个参数最后压入堆栈,而不是使用ECX

    53920

    C语言 | C++ 堆栈工作机制

    ESP 寄存器总是指向堆栈的栈顶,执行 PUSH 命令向堆栈压入数据时,ESP减4,然后把数据拷贝到ESP指向的地址;执行POP 命令时,首先把 ESP 指向的数据拷贝到内存地址/寄存器中,然后 ESP...在函数开始时,对应的堆栈帧已经完整地建立了(所有的局部变量在函数帧建立时就已经分配好空间了,而不是随着函数的执行而不断创建和销毁的);在函数退出时,整个函数帧将被销毁。...事实上,调试器正是这么做的,这也就是为什么调试时我们查看函数调用顺序时总是说“查看堆栈”了。...返回值是如何传递的 堆栈帧建立起后,函数的代码真正地开始执行,它会操作堆栈中的参数,操作堆栈中的局部变量,甚至在堆(Heap)上创建对象,balabala…....如果显式地把类成员函数声明为使用__cdecl或者__stdcall,那么,将采用__cdecl或者__stdcall的规则来压栈和出栈,而this指针将作为函数的第一个参数最后压入堆栈,而不是使用ECX

    7.8K88

    你所能用到的数据结构(七)

    在使用指针实现之前,先看看数组为什么能实现堆栈等类似的结构,首先,一个数组可以通过下标来进行遍历,也就是说可以让我们从一个元素寻访到下一个元素或者某一个元素,第二个,数组可以包含元素。...我们可以利用指针,所以在创建堆栈之前,我们首先需要做的是需要创建一个这样的结构,一般情况下将这种结构成为节点(Node),节点的意思是“是在运行时存在的物理元素,它表示了一种可计算的资源,它通常至少有一些记忆能力和处理能力...,不同的是构造函数之中没有大小了,因为使用指针可以动态的制定大小,还有一个就是成员变量换成了节点,这就好比一节车厢。...下面就要思考如何实现了,构造函数就是初始化,构造上面说的一个火车,最开始什么都没有的情况下应该先把火车头先开来放好,然后这个火车头后面什么也没有连接,在程序上也就是指针指向null,你可以理解为火车头后面的挂钩挂着...然后就是push,如果现在要在后面挂一节车厢,那么就是将车厢开来(声明一个新的节点),用后一节车厢的挂钩挂上前面面一节车厢(在程序上实现就是将当前Node结构的指针指向“->"这个新添加的节点,符号"-

    57580

    ndk C++ 编译器的函数名修饰规则

    MakeFun的函数认为是 __cdecl调用方式,b模块中的这些函数在调用完MakeFun当然要帮着恢复堆栈啦,可是MakeFun已经在结束时自己恢复了堆栈,b模块中的函 数这样多此一举就引起了栈指针错误...栈是一种先后进先出的数据结构,栈有一个存储区、一个栈顶指针。栈顶指 针指向堆栈中第一个可用的数据项(被称为栈顶)。...,则可以翻译为: push ebp // 保存ebp寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复 mov ebp,esp // 保存堆栈指针 mov eax,[ebp...其中在函数开始处保留esp到ebp中,在函数结束恢复是编译器常用的方法。 从函数调用看,2和1依次被push进堆栈,而在函数中又通过相对于ebp(即刚进函数时的堆栈指针)的偏移量存取参数。...被调用函数_function处 push ebp // 保存ebp寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复 mov ebp,esp // 保存堆栈指针

    2.1K31

    Win32汇编:过程与宏调用

    在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种后进先出(LIFO,Last-In,First-Out)的数据结构,这是因为最后压入堆栈的值总是最先被取出,而新数值在执行PUSH压栈时总是被加到堆栈的最顶端...堆栈操作指令 在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种后进先出(LIFO,Last-In,First-Out)的数据结构,这是因为最后压入堆栈的值总是最先被取出,而新数值在执行PUSH压栈时总是被加到堆栈的最顶端...◆堆栈参数传递◆ 在通常情况下ESP是可变的,随着栈的生产而逐渐变小,而EBP寄存器是固定的,只有当函数的调用后,发生入栈操作而改变. 1.在32位系统中,执行PUSH压栈时,堆栈指针自动减4,再将压栈的值复制到堆栈指针所指向的内存地址.... 2.在32位系统中,执行POP出栈时,从栈顶移走一个值并将其复制给内存或寄存器,然后再将堆栈指针自动加4. 3.在32位系统中,执行CALL调用时,CPU会用堆栈保存当前被调用过程的返回地址,直到遇到...高级语言程序中,在单个过程中创建使用和销毁的变量我们称它为局部变量(local variable),局部变量是在程序运行时,由系统动态的在栈上开辟的,在内存中通常在基址指针(EBP)之下,尽管在汇编时不能给定默认值

    66120

    函数栈帧的创建与销毁

    前言 最近在学习C语言的过程中遇到了一些问题,在询问老师和查询相关资料的基础上了解到了函数栈帧的相关概念,对下列问题也有了答案。 局部变量是如何创建的? 未初始化的局部变量为什么是随机值?...栈顶和栈底都有指针,栈顶指针是esp,栈底指针是ebp,即esp指向栈顶,ebp指向栈底。...函数返回时作 mov esp,ebp pop ebp ret 即可。 ESP 专门用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。...(本次的代码调试我使用的环境是VS2013版,其他版本可能会有细微差别,但大体步骤和内容是类似的) 1.源代码 为了演示这次函数栈帧的创建与销毁,我们将以一次简单的程序来作为范例。...0E4h位字节,这一步是为mian函数在栈区预创建空间 00E91419 push ebx //把ebx压入栈中 00E9141A push esi //把esi压入栈中

    53420

    Win32汇编:过程与宏调用

    在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种后进先出(LIFO,Last-In,First-Out)的数据结构,这是因为最后压入堆栈的值总是最先被取出,而新数值在执行PUSH压栈时总是被加到堆栈的最顶端...,First-Out)的数据结构,这是因为最后压入堆栈的值总是最先被取出,而新数值在执行PUSH压栈时总是被加到堆栈的最顶端,数据也总是从堆栈的最顶端被取出,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址...◆堆栈参数传递◆在通常情况下ESP是可变的,随着栈的生产而逐渐变小,而EBP寄存器是固定的,只有当函数的调用后,发生入栈操作而改变.1.在32位系统中,执行PUSH压栈时,堆栈指针自动减4,再将压栈的值复制到堆栈指针所指向的内存地址....2.在32位系统中,执行POP出栈时,从栈顶移走一个值并将其复制给内存或寄存器,然后再将堆栈指针自动加4.3.在32位系统中,执行CALL调用时,CPU会用堆栈保存当前被调用过程的返回地址,直到遇到RET...ENDPEND main◆声明局部变量◆高级语言程序中,在单个过程中创建使用和销毁的变量我们称它为局部变量(local variable),局部变量是在程序运行时,由系统动态的在栈上开辟的,在内存中通常在基址指针

    46430

    X86函数调用模型分析

    static section:在程序执行期间不改变的常量和静态变量。 heap:使用malloc申请的堆内存,向内存地址升序的方向生长:grows up。...当调用函数发生时,caller执行逻辑会跳转到callee,拿到结果后,在跳转会caller。这就需要改变下面几个寄存器的值: eip指令指针,需要改成指向callee的指令。...ebp 和 esp 当前分别指向caller栈帧的顶部和底部。两个寄存器都需要更新为 指向callee的新栈帧的顶部和底部。 当函数返回时,需要恢复寄存器中的旧值,才可以返回caller。...x86将参数压入堆栈来传递参数。请注意,当我们将参数压入堆栈时,esp 会递减。参数以相反的顺序压入堆栈。...(上面是高地址) image.png step2:旧的eip入栈 旧的eip(rip)压入堆栈。跳转到子函数执行eip需要指向子函数,所以这里先保存下。

    1.2K20

    X86如何实现函数调用?

    static section:在程序执行期间不改变的常量和静态变量。 heap:使用malloc申请的堆内存,向内存地址升序的方向生长:grows up。...当调用函数发生时,caller执行逻辑会跳转到callee,拿到结果后,在跳转会caller。这就需要改变下面几个寄存器的值: eip指令指针,需要改成指向callee的指令。...ebp 和 esp 当前分别指向caller栈帧的顶部和底部。两个寄存器都需要更新为 指向callee的新栈帧的顶部和底部。 当函数返回时,需要恢复寄存器中的旧值,才可以返回caller。...x86将参数压入堆栈来传递参数。请注意,当我们将参数压入堆栈时,esp 会递减。参数以相反的顺序压入堆栈。(上面是高地址) step2:旧的eip入栈 旧的eip(rip)压入堆栈。...step8:返回esp回到堆栈顶部 step9:恢复旧的ebp 使用esp从堆栈中pop出一个值(old ebp),把old ebp的值赋给ebp。

    2.8K20
    领券