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

【C++】引用this指针秘密

当调用成员函数a.disp()时,编译系统就会把对象a起始地址赋值给this指针,于是在成员函数引用数据成员时,就可以通过this指针索引到对象a数据成员。...为什么叫this指针,而不是引用呢?...首先应该明确指针引用在底层实现是相同,之所以叫this指针,是因为最开始将C++称作带类C,而引用则是在C++1.0版才加入使用,因此叫做this指针。...this指针是如何访问类中变量? 如果不是类,而是结构的话,那么,如何通过结构指针来访问结构变量呢?如果你明白这一点的话,那就很好理解这个问题了。...在C++中,类和结构是只有一个区别的:类成员默认是private,而结构是public。this是类指针,如果换成结构,那this就是结构指针了。

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

const修饰符使用(修饰结构指针引用外部const 变量)

const修饰结构指针 //对结构体进行封锁 typedef struct { int a; int b; }my_struct; void fun1(my_struct *p)...{ //结构指针可以修改 //结构指针指向内存也可以改变 } void fun2(my_struct const *p) { //结构指针可以修改 //如...p = NULL; 是可以修改 //结构指针指向内容不能修改 //p->a = 10 是错误 } void fun3(my_struct * const p) {...//结构指针指向不可以修改 p = NULL是错误 //结构指针指向内容可以修改 p->a = 10是可以修改 } void fun4(const my_struct * const...p) { //结构指针指向不可以修改 //结构指针指向内存当中内容也不可以修改 } 如何引用其他.c文件中const变量 extern const int a;//注意,不能再进行赋值

50410

指针03

= &A[0] 然后我们就可以用指针来操作数组元素了 比如&A[2] = A+2 如果要解引用(A+2)即可 可以把A存放到指针指针代替A进行解引用和运算 int *p = &A[0]; 也可以写作...1,2,3,4,5 }; int result = Sumarry(arry); printf("the result was = %d\n", result); } 大家觉得这个程序运行结果是多少...也就是说并不像我们想那样 会将一整个数组全部传过来 仅仅会传递数组元素首地址,所以我们要想在被调函数中使用数组(知道他大小)就必须传递一个数组大小参数 #include int...} printf("\n"); } int main() { char str[] = "hello"; printfchar(str); } 也可以去掉i 利用指针进行增...`C++++ 在内存中分析这个程序 字符数组大小 = 字符数组元素数量 字符数组存放字符串大小 =字符数组元素数量+1 乱总结 迷糊别看 char*和char[]辨析 char str[]

9820

自定义类型之结构体,枚举,联合

目录 一、结构体 1.1 匿名结构体 1.2 结构引用 1.3 结构体内存大小计算 示例1:普通结构体 **示例2:**包含**double**类型成员结构体 示例3:**嵌套结构体**内存大小计算...,刚好偏移量又一样,所以才会打印出来,但是这并不意味着这两个结构体类型相同. 1.2 结构引用 之前我们见过结构嵌套定义....年龄 char sex[5];//性别 struct student s1; }stu; 原因: 虽然我们这里正确使用了结构类型名,但是,如果一个结构体中引用了自己,那么这个结构大小是多少...* next;//一个结构指针,用于指向与自己类型相同结构体 }stu; 这种结构引用情况在数据结构链表中就有应用....试着猜一下结构体stu大小是多少?

49660

iOS底层原理(一):OC对象实际占用内存与开辟内存关系

对象实际占用内存大小,就是系统实际分配给对象内存大小,OC对象是通过alloc方法得到对象大小,我们可以通过malloc中库函数malloc_size来得到结果。...Animal结构体对象实际需要内存大小应该是16字节(指针8个字节,int型变量4个字节)。Animal结构体对象实际需要内存大小是12字节,那系统给Animal对象实际分配内存大小是多少呢?...,这里最大成员变量是指针变量(8个字节),结构最终大小需要是8整数倍,所以结果是16而不是12。...我们可以简单推算一下,对象结构中有4个成员变量,一个指针变量和3个int型变量,4个成员变量内存大小加起来是20(8+4+4+4)个字节大小,根据结构体内存对齐原则,结构体实际需要内存大小应该是...对象实际需要内存大小是24个字节,那么系统实际分配给对象内存大小是多少呢?我们可以通过代码来查看一下最终结果。

49620

【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)

结构引用 2.1 结构引用作用 2.2 结构引用注意事项 3.结构体变量定义和初始化 3.1 用标签名定义和初始化 3.1.1 如何不按顺序初始化 3.2 typedef 定义和初始化...3.结构体嵌套定义和初始化 3.1 引用定义和初始化 4....如果可以,那 sizeof(struct Node)是多少?诶这里我们就会发现我们根本计算不了这个结构大小是多少!...前面结构体包含结构初始化我们都知道了,那么引用和它基本一样,引用引用是相同类型地址所以我们可以先赋值为 NULL 空指针就好!...结构引用 引用例子链表 结构体嵌套如何定义 结构体传参注意事项 ☁️ 把本章内容全部掌握,铁汁们就又向下一部分知识数据结构前进了一大步呢!

35310

Java虚拟机(二)对象创建与OOP-Klass模型

前言 在前一篇文章中我们学习了Java虚拟机结构原理与运行时数据区域,那么我们大概知道了Java虚拟机内存概况,那么内存中数据是如何创建和访问呢?这篇文章会给你答案。...(1)判断对象对应类是否加载、链接、初始化 虚拟机接收到一条new指令时,首先会去检查这个指定参数是否能在常量池中定位到一个类符号引用,并且检查这个符号引用代表类是否已被类加载器加载、链接和初始化过...分配内存时将位于中间指针指示器向空闲内存移动一段与对象大小相等距离,这样便完成分配内存工作。...instanceKlass继承Klass ,枚举ClassState 用来标识对象加载进度。...从图中可以看出,通过栈帧中对象引用找到Java堆中instanceOopDesc对象,再通过instanceOopDesc中元数据指针来找到方法区中instanceKlass,从而确定该对象具体类型

1.2K100

Swift基础 结构和类

翻译:https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html 结构和类是通用、灵活结构,成为程序代码构建块...(结构和枚举并非如此,因为它们在分配给常量或变量或传递给函数时总是被复制。) 有时,找出两个常量或变量是否引用一个类完全相同实例是有用。...指针 如果您有使用C、C++或Objective-C经验,您可能知道这些语言使用指针引用内存中地址。...引用某些引用类型实例Swift常量或变量类似于C中指针,但不是指向内存中地址直接指针,并且不需要您编写星号(*)来指示您正在创建引用。...相反,这些引用定义与Swift中任何其他常量或变量一样。标准库提供了指针和缓冲区类型,如果您需要直接与指针交互,您可以使用这些类型,请参阅手动内存管理。

6400

【自定义类型详解】第一篇——结构体详解

两种方式: 我们可以对该结构指针引用,这样就找到了对应结构体变量,然后我们就可以使用(.)操作符来访问成员变量了。 那我们可不可以直接通过结构指针访问对应结构成员变量呢? 当然可以。...8.结构引用 首先,我们来思考一个问题: 在结构体中包含一个类型为该结构体本身成员是否可以呢?...通过这样一个问题,我们引出一个新概念: 结构引用:在结构体内部,包含指向自身类型结构指针。 数据结构中链表结点其实就是这样搞。...这也是一个特别热门考点: 结构体内存对齐 首先我们先来探讨一个问题,大家思考一下下面这两个结构体S1,S2大小是多少?...所以S1大小为1+4+1=6个字节。 那S2的话成员和S1一模一样,只是顺序不同,所以大小也应该是6个字节。 是这样吗? 我们来看一下运行结果到底是多少

10810

自定义类型详解

= &a3; //创建一个名字为addressstruct abc类型结构指针来储存a3这个结构体变量地址 printf("%d %c %f\n", address->a,address-...>b,address->c); //通过->访问地址方式将内容打印出来 } 2.4结构引用 2.4.1错误引用 #include struct abc { int a...2.4.2正确引用 #include struct abc { int a; struct abc* a1; //结构体里存放一个结构地址,而被存放结构体也能存放一个结构地址...//那么有一个结构体,便可链接所有这个结构体类型变量 //实现一个访问所有 }; 只要你是个地址你所占字节大小不是4(32位)就是8(64位),因此计算机可以分配给它空间,这个结构体和上面那个错误结构体最大区别就是一个存放是地址...4个字节,4,5,6,7空间被占据,故最后char c会存放在偏移量为8位置,空间大小好像是9个字节,但别忽略了第三条,结构体总大小为最大对齐数整数倍,这里最大对齐数,显然是4,故结构大小应为

11310

自定义类型:结构体(引用、内存对齐、位段(位域))

三、结构引用 注:结构引用方式里面必须包含同类型结构指针结构中包含一个类型为该结构本身成员是否可以呢?...正确引用方式: struct Node { int data; struct Node* next; }; 是否可以使用匿名结构体呢?...在结构引用使用过程中,夹杂了 typedef 对匿名结构体类型重命名,也容易引入问题,看看 下面的代码,可行吗?...* next; }Node; 引用使用案例: 链表: 在链表中,每个节点都包含数据和指向下一个节点指针,这个指针就是引用,它指向下一个相同类型节点。...指针传递: 在指针传递中,结构地址被传递给函数,函数内部通过使用指针来访问和修改结构内容。这种方式可以避免结构副本创建,因此对于大型结构体更为高效。

12910

白话Elasticsearch67-不随意调节jvm和thread pool原因&jvm和服务器内存分配最佳实践

还有另外一个原因不要将过多内存分配给esjvm heap。如果heap小于32G化,jvm会用一种技术来压缩对象指针,object pointer。...对于32位系统来说,jvm最大heap size就是4G,解释一下,32位,0和1值,0和1在32位组合是2^32次方字节,除以1024就是多少k,再除以1024就是多少mb,再除以1024就是多少...这就意味着32位pointer可以引用400万个对象,而不是400万字节。这也意味着,使用32位pointer,最大heap大小可以到32G。...此时只要heap size在32G以内,jvm就会自动启用32位object pointer,因为32位对象指针,足够引用32G内存了,就可以用32位pointer替代64位pointer。...此时pointer就会退回到传统object pointer引用对象二进制地址模式,此时object pinter大小会急剧增长,更多cpu到内存带宽会被占据,更多内存被耗费。

1.5K20

C语言进阶——自定义类型

2.全局性结构体变量创建好后,只能紧接着对其初始化,无法在调用环境中初始化 3.当出现多个匿名结构体时,编译器会认为是不同类型,强行使用会引发警告 4.引用 引用是指在结构体中能找到一个和自己类型相同成员...结构引用出现于链表中,比如单链表中有一个 data 数据域和一个 next 指针域,其中成员变量 next 类型是结构指针,此行为就是引用。...//结构引用 //链表中用到了引用 struct SList { int data[10];//数据域 struct SList* next;//指针域 }; int main() { struct...,理解透彻了,链表学起来就会很容易  注意: 1.引用时,其中某个成员变量名必须和结构体类型相同,关键字、标签名、指针一样都不能少 2.使用引用时,各变量首尾链接关系要理清 5.变量定义和初始化...3.修改完默认对齐数后,记得改回来 8.结构体传参   结构体传参有两种方式:传值与传址,传值不会对原数据造成影响,但会申请一块同样大空间;传址能间接修改原数据,且只占一个指针大小空间。

23220

精选嵌入式笔试题目(已标记考点)

后面四个是指针,他们指向相等。...: 1、一个类友元函数可以访问该类(D) A私有成员 B保护成员 C公有成员 D所有成员 2、静态变量作用域:本文件 3、进栈1234,栈进出不可能顺序是 6、C++中指针引用区别...8、异常定义,什么时候会抛出异常 9、n个节点单项链表(没有头节点),最少有几个指针域 11、析构函数中不能做是:抛出异常 12、关于智能指针使用一些注意点 13、http默认端口号:80 14..._t unit8_t 4、FIQ中断向量入口地址 5、R15还可以作为程序计数器 6、大小端 二、多选 1、哪些类型可以加 i++ 2、全双工总线类型 3、线程间同步方式 三、填空 1、编译优化选项...4、对900,512,613,700,810,采用选择排序,则第三轮排序后结果输出是多少? 5、某一段程序时间复杂度是多少 7、入栈ABCDE,不可能出栈顺序是?

1.5K20

Android 进阶解密笔记-Java 类加载器

摘抄>一书 Java 跨平台 Java是通过实现不同平台上虚拟机,然后即时翻译javac生成中间代码来做到跨平台。...虚拟机将常量池内符号引用替换为直接引用 初始化:将类变量初始化正确初始值 加载阶段(不是类加载)主要做了三件事: 根据特定名称查找类或者接口类型二进制字节流 将这个二进制字节所代表静态存储结构转化为方法区运行时数据结构...为对象分配内存,有两种方式: 指针碰撞:如果Java堆内存是规整,即所有用过内存放在一边,而空闲内存放在另一边。...分配内存时将位于中间指针指示器向空闲内存移动一段与对象大小相等距离,这样来完成分配内存操作 空心列表:如果Java堆内存不是规整,则需要由虚拟机维护一个列表来记录那些内存时可用,这样分配时,从列表查询足够大内存分配给对象...static成员进行初始化 递归调用超类构造方法 调用子类构造方法 应用阶段 当对象被创建,并分配给变量赋值时,状态就切换到了应用阶段。

49620
领券