指针

C++ 智能指针weak_ptr用途浅析

蹲街弑〆低调 提交于 2019-12-21 05:06:52
文章目录 C++ 智能指针weak_ptr用途浅析 1. weak_ptr的特性 2. 二叉树的实现 2.1 问题 2.2 方案1 2.3 方案2 3. 总结 C++ 智能指针weak_ptr用途浅析 我们知道C++智能指针有 shared_ptr 和 unique_ptr ,这两种指针基本就可以胜任堆内存的管理了,那么C++为什么还要提出 weak_ptr 呢? weak_ptr 这个东西到底有什么用途呢? 1. weak_ptr的特性 weak_ptr 也是指向 shared_ptr 指向的对象,但是并不管理引用计数和内存,操作如下: 所以,如果要使用weak_ptr,必须锁定为shared_ptr shared_ptr<element_type> lock() const noexcept; 从上面我们也可以知道,weak_ptr的初始化也是从shared_ptr来的,如下: //default (1) constexpr weak_ptr() noexcept; //copy (2) weak_ptr (const weak_ptr& x) noexcept; template <class U> weak_ptr (const weak_ptr<U>& x) noexcept; //from shared_ptr (3) template <class U> weak

Go中的反射reflect

喜欢而已 提交于 2019-12-21 04:14:47
前面我们在学习到 struct 结构体的时候,因为结构体中的字段首字母大写,而我们想把json文件映射到该结构体上时,需要在在结构体字段后面加上json标签,表明结构体字段和json字段的映射关系。这其中就用到了反射的方式去获取标签,取出该标签对应的json字段然后存储到结构体字段上。 Go语言中提供了反射的包为 reflect 。在 reflect 包中,主要通过两个函数 TypeOf() 和 ValueOf() 实现反射, TypeOf() 获取到的结果是 reflect.Type 类型, ValueOf() 获取到的结果是 reflect.Value 类型。 1. 理解反射的类型(Type) reflect.TypeOf() 返回的是Type类型,Type中包含了一个对象会有的相关信息,对象名,对象类型,对象的方法,对象中的属性等等。 reflect.Type中的方法: // 通用方法 func (t *rtype) String() string // 获取 t 类型的字符串描述,不要通过 String 来判断两种类型是否一致。 func (t *rtype) Name() string // 获取 t 类型在其包中定义的名称,未命名类型则返回空字符串。 func (t *rtype) PkgPath() string // 获取 t 类型所在包的名称

15.反转链表

大城市里の小女人 提交于 2019-12-21 03:19:43
题目 输入一个链表,反转链表后,输出新链表的表头。 思路 在调整节点i的next指针,需要知道节点i的前一个节点h,事先还要保存i的下一个节点j,以防止链表断开。需要定定义三个指针 代码 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public : ListNode * ReverseList ( ListNode * pHead ) { ListNode * pRversedHead = NULL ; ListNode * pNode = pHead ; ListNode * pPrev = NULL ; while ( pNode != NULL ) { ListNode * pNext = pNode - > next ; if ( pNext == NULL ) { pRversedHead = pNode ; } pNode - > next = pPrev ; pPrev = pNode ; pNode = pNext ; } return pRversedHead ; } } ; 来源: CSDN 作者: 含糖的八宝粥 链接: https://blog.csdn.net/weixin

C语言指针变量的长度

风格不统一 提交于 2019-12-21 03:03:41
#include <stdio.h> int main() { /********************************************* * * 指针的长度:不同机器可能不同,但是指针变量的长度都是一样的 * **********************************************/ int a = 10; int *pi = &a; printf("int类型指针的长度:%d\n",sizeof(pi)); double b = 10; double *pd = &b; printf("double类型指针的长度:%d\n",sizeof(pd)); float f = 10; float *pf = &f; printf("float类型指针的长度:%d\n",sizeof(pf)); char c = 10; char *pc = &c; printf("char类型指针的长度:%d\n",sizeof(pc)); return 0; } int类型指针的长度:4 double类型指针的长度:4 float类型指针的长度:4 char类型指针的长度:4 来源: https://www.cnblogs.com/heml/p/3530151.html

JVM内存模型详解

∥☆過路亽.° 提交于 2019-12-21 01:48:04
内存模型 内存模型如下图所示 堆 堆是Java虚拟机所管理的内存最大一块。 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。 此内存区域唯一的目的就是存放对象实例。所有的对象实例都在这里分配内存 Java堆是垃圾收集器管理的主要区域。从内存回收的角度来看,由于现在的垃圾收集器采用的是分代收集算法。所以,java堆又分为 新生代 和 老年代 。从内存分配的角度来说,线程共享的java对中可能划分出多个线程私有的fenp缓冲区(Thread Local Allocation Buffer)。 可以通过 -Xms 、 -Xmx 分别控制堆初始化是最小堆内存和最大堆内存大小。 虚拟机栈 与程序计数器一样,java虚拟机栈也是线程私有的,他的生命周期与线程相同 。 虚拟机栈描述的是Java方法的执行的内存模型:每个方法在执行的同时会创建一个 栈桢(stack frame) 用于存储 局部变量表、操作数栈、动态链表、方法出口等信息 。每个方法从调用直至执行完成的过程,就对应着栈桢在虚拟机栈中入栈到出栈的过程。 虚拟机栈存储的数据类型 局部变量表 存放的是编译器可知得到各种基本数据类型 boolean、byte、char、short、int、float、long、double、对象引用(refrence类型,不等同于对象本身,一个指向对象的起始内存位置的引用指针) 操作数栈 动态链表

每日一go(2)

自闭症网瘾萝莉.ら 提交于 2019-12-21 01:29:37
1. 下面代码能编译通过吗?请简要说明。 2. 下面代码输出什么? 解析 1: 能编译通过,输出 [1 2 3 0 1 2]。 for 循环开始的时候,终止条件只会计算一次 2: 指针变量指向相同的地址。 来源: CSDN 作者: 我是大黄蜂 链接: https://blog.csdn.net/weixin_39658118/article/details/103627598

206.双指针反转链表

徘徊边缘 提交于 2019-12-21 01:27:03
题目要求:反转一个链表 https://leetcode-cn.com/problems/reverse-linked-list/ 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 思路:1. 定以结点 pre = null; cur = head; 2.将head 后移 (head = head.next), cur 指向 pre(cur.next = pre ;) ;然后pre,cur后移到它两的下一跳(pre = cur;cur =head) 3.若head ==null;则循环结束,链表已经反转完毕。 代码: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseList(ListNode head) { ListNode pre = null; ListNode cur = head; while(head!=null){ head = head.next; cur.next = pre; pre = cur; cur = head

ref和引用类型传参的区别

吃可爱长大的小学妹 提交于 2019-12-20 23:57:03
引用类型对象本身不改变,只改变对象的属性时,我们在操作同一个对象;(类似c++指针指向的地址) 如果连对象本身都可能会改变,又要保证在操作同一个对象,就用ref传引用类型的对象吧!(类似c++指向一个地址的指针,这样地址就可以改变了) ref不是很好理解,用的人比较少,一般都在在方法返回值里返回新创建的对象。 1.01 365 =37.8     1.02 365 =1377.4 0.99 365 =0.03     0.98 365 =0.0006 来源: https://www.cnblogs.com/bile/p/6911893.html

【c++】常量指针/指针常量

纵饮孤独 提交于 2019-12-20 23:48:14
1. 常量指针 :表示指针指向一个被const修饰的变量;   两种写法:    1.const 类型 * 指针名;//例如const int* p;    2.类型 const * 指针名;//例如int const* p;   赋值:    1.const变量的地址    2.非const变量的地址   特点:    1.指向的内容(const)不能修改;    2.指向可以修改; 指针常量 :表示指针本身是一个被const修饰的变量;   一种写法:    指向的类型 * const 指针名; // 例如 int* const p;   初始化:    非const的变量的地址;   特点:    1.必须初始化    2.指向的内容可以修改    3.指向不能修改; 常量指针常量 :1.指向常量 2.本身也是常量   写法:    const int* const p;    int const* const p;   特点:    1.必须初始化    2.不可以改变指向,不能改变指向的内容; 2.区分常量指针和常量指针:const和*的位置关系; 3.const:修饰变量,表示变量是只读的;   特点: 1.必须初始化      2.不能被修改; 4.常量指针和指针常量的区别:   1.常量指针表示指针指向一个被const修饰的变量,   

剑指offer-链表中环的入口结点

此生再无相见时 提交于 2019-12-20 23:11:19
题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路 设置快慢指针,都从链表头出发,快指针每次走两步,慢指针一次走一步,假如有环,一定相遇于环中某点(结论1)。接着让两个指针分别从相遇点和链表头出发,两者都改为每次走一步,最终相遇于环入口(结论2)。以下是两个结论证明: 设置快慢指针,假如有环,他们最后一定相遇 证明: 设置快慢指针fast和low,fast每次走两步,low每次走一步。假如有环,两者一定会相遇(因为low一旦进环,可看作fast在后面追赶low的过程,每次两者都接近一步,最后一定能追上)。 两个指针分别从链表头和相遇点继续出发,每次走一步,最后一定相遇与环入口。 证明: 设: 链表头到环入口长度为–a 环入口到相遇点长度为–b 相遇点到环入口长度为–c 则:相遇时 快指针路程=a+(b+c)k+b ,k>=1 其中b+c为环的长度,k为绕环的圈数(k>=1,即最少一圈,不能是0圈,不然和慢指针走的一样长,矛盾)。 慢指针路程=a+b 快指针走的路程是慢指针的两倍,所以: (a+b)*2=a+(b+c)k+b 化简可得: a=(k-1)(b+c)+c 这个式子的意思是: 链表头到环入口的距离=相遇点到环入口的距离+(k-1)圈环长度。其中k>=1,所以k-1>=0圈。所以两个指针分别从链表头和相遇点出发,最后一定相遇于环入口。