指针变量

js中的堆内存和栈内存

☆樱花仙子☆ 提交于 2020-02-15 07:18:23
我们常常会听说什么栈内存、堆内存,那么他们到底有什么区别呢,在js中又是如何区分他们的呢,今天我们来看一下。 一、栈内存和堆内存的区分 一般来说, 栈内存 主要用于存储各种 基本类型 的变量,包括Boolean、Number、String、Undefined、Null...以及 对象变量的指针 ,这时候栈内存给人的感觉就像一个线性排列的空间,每个小单元大小基本相等,栈内存中的变量一般都是已知大小或者有范围上限的,算作一种简单存储。 而 堆内存 主要负责像对象Object这种变量类型的存储,堆内存存储的对象类型数据对于大小这方面,一般都是未知的,(所以这大概也是为什么null作为一个object类型的变量却存储在栈内存中的原因)。 来一张图感受一下: 二、测试 Ⅰ.基本数据类型 /* 基本数据类型 */ var a = 1; var b = 1; console.log(a === b);//true var c = '桔子桑'; var d = '桔子桑'; console.log(c === d);//true 基本数据类型,因为都是存在栈内存中的,以上面的int为例: var a = 1;变量 a 存在栈内存中,他的值是基本数据类型(int),自然也是在栈内存中,栈内存有没有1?没有那就拿出一块内存存1,这个变量a指向这块值为1的栈内存地址; var b = 1;同理,变量 b

第9课 智能指针示例

隐身守侯 提交于 2020-02-15 05:28:57
1. 内存泄漏( 臭名昭著的Bug ) (1)动态申请堆空间,用完后不归还 (2)C++语言中没有垃圾回收的机制 (3)指针 无法控制 所指堆空间的生命周期 2. 当代C++软件平台中的智能指针 (1)指针生命周期结束时 主动释放堆空间 (2)一片堆空间最多 只能由一个指针标识 (3) 杜绝指针运算和指针比较 3. 智能指针的设计的方案 (1)通过 类模板 描述指针的行为:能够定义不同类型的指针对象。 (2)重载指针特征操作符( -> 和* ):利用对象模拟原生指针的行为。 (3)智能指针的 使用军规 :只能用来指向堆空间中的 单个对象(即不能指定一个数组对象的空间)或者变量 【编程实验】智能指针 //SmartPointer.h #ifndef _SMARTPOINTER_H_ #define _SMARTPOINTER_H_ namespace DTLib{ //智能指针 template<typename T> class SmartPointer { T* m_pointer; public: SmartPointer(T* p = NULL) { m_pointer = p; } SmartPointer(const SmartPointer<T>& obj) { m_pointer = obj.m_pointer; //所有权转移,使得同一时刻只能由一个指针指向堆空间

C++总结(四)

主宰稳场 提交于 2020-02-15 02:23:48
一、多态 1.多态的概念 多态:同一个事物,在不同场景下表现出的不同的状态 2.多态的分类 静态多态(早绑定,静态联编): 在编译期间,根据所传递的实参类型或者实例化的类型,来确定到底应该调用那个函数即:在编译期间确定了函数的行为—函数重载、模板 动态多态(晚绑定,动态联编):在程序运行时,确定具体应该调用那个函数 3.动态多态的实现条件-- -在继承的体系中 虚函数&重写:基类中必须包含有虚函数(被virtual修饰的成员函数),派生类必须要对基类的虚函数进行重写 关于虚函数调用:必须通过基类的指针或引用调用虚函数 体现:在程序运行时,基类的指针或引用指向那个子类的对象,就会调用那个子类的虚函数 4.重写 1.基类中的函数一定是虚函数 2.派生类虚函数必须与基类虚函数的原型一致:返回值类型 函数名字(参数列表) 例外: a、协变–基类虚函数返回值基类的指针或引用 派生类虚函数返回派生类的指针或引用基类虚函数和派生类虚函数的返回值类型可以不同 b、析构函数:如果将基类中析构函数设置成虚函数,派生类的析构函数提供,两个析构函数就可以构成重写;两个析构函数名字不同 3.基类虚函数可以和派生类虚函数的访问权限不一-样 4、为了让编译器在编译期间帮助用户检测是否重写成功,C+ +11提供非常有用的关键字 1、override:专门]让编译帮助用户检测派生类是否成功重写了基类的虚函数

13.结构体

こ雲淡風輕ζ 提交于 2020-02-15 00:56:35
1.结构体 a.struct是关键字; b.struct Student合起来才是结构体“类型”; c.结构体内部定义的变量不能直接赋值; d.结构体只是一个类型,没有定义变量前,是没有分配空间,就不能赋值。 2.使用: (1).定义结构体变量; (2).类型名 变量名: struct Student stu; //struct关键字 //结构体变量初始化,和数组一样,要使用大括号 //在定义时才初始化 struct Student stu2 = {18,"hello",59}; (3).如果是普通变量,使用“.”运算符; (4).结构体指针变量使用:-> struct Student *p; p = &tmp; //给结构体变量一个空间 p -> age = 18;p->name = (char *)malloc((strlen("mike")+1); //给成员分配空间,如果name是结构体成员是数组,和数组操作类似 strcopy(p->name,"mike"); p->score = 59; //指针要有合法指向,才能操作结构体成员 //任何结构体变量都可以用“.”或“->” (&temp)->age = 18; (*p).age = 18; //合法 3.结构体变量定义: 4.迭名结构体 5.结构体数组 6.结构体嵌套 struct Info { int age;

C@指针&数组

拟墨画扇 提交于 2020-02-15 00:54:03
一、指针数组和数组指针 1、字面意思理解指针数组和数组指针 指针数组的实质就是一个数组,这个数组中存储的内容全部是指针变量 数组指针的实质是一个指针,这个指针指向的是一个数组。 2、分析指针数组和数组指针的表达式 (1)int*p[5]; int(*p)[5]; int *(p[5]); (2)一般规律 :int *p;(p是一个指针) int p[5] ;(p是一个数组) 总结:我们定义一个符号时,关键在于首先找到定义的符号是谁(第一步找核心) 其次再来看谁跟核心最近,谁跟核心结合(第二部:找结合) 以后继续向外扩展(第三步:继续向外结合直到符号完) (3)核心结合 - 如何核心和 “ * ”结合,表示核心是指针, - 如果核心和“[ ]”结合表示核心是数组, - 如果核心和小括号“()”结合,表示核心是函数 (4)一般规律来分析3个符号 例子1: int *p[5]; (“[ ]”的优先级比“ * ”优先级高) p是一个数组,数组有5个元素,数组中的元素都是指针,指针指向的元素类型是int类型,整个符号是一个指针数组。 例子2: int (*p)[5]; 核心是p,p是一个指针,因为p被用括号和星好强制结合起来了。指针指向一个数组,数组有5个元素,数组中存在的元素是int类型; 例子3: int *(p[5]); 这里 加小括号没有意义,没起到左右,没有小括号,也是p与[

java与C++的区别

不问归期 提交于 2020-02-14 17:46:42
“作为一名C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且Java的语法无疑是非常熟悉的。事实上,Java本来就是从C++衍生出来的。”   然而,C++和Java之间仍存在一些显著的差异。可以这样说,这些差异代表着技术的极大进步。一旦我们弄清楚了这些差异,就会理解为什么说Java是一种优秀的程序设计语言。本附录将引导大家认识用于区分Java和C++的一些重要特征。   (1) 最大的障碍在于速度:解释过的Java要比C的执行速度慢上约20倍。无论什么都不能阻止Java语言进行编译。写作本书的时候,刚刚出现了一些准实时编译器,它们能显著加快速度。当然,我们完全有理由认为会出现适用于更多流行平台的纯固有编译器,但假若没有那些编译器,由于速度的限制,必须有些问题是Java不能解决的。   (2) 和C++一样,Java也提供了两种类型的注释。   (3) 所有东西都必须置入一个类。不存在全局函数或者全局数据。如果想获得与全局函数等价的功能,可考虑将static方法和static数据置入一个类里。注意没有象结构、枚举或者联合这一类的东西,一切只有“类”(Class)!   (4) 所有方法都是在类的主体定义的。所以用C++的眼光看,似乎所有函数都已嵌入,但实情并非如何(嵌入的问题在后面讲述)。   (5) 在Java中,类定义采取几乎和C++一样的形式。但没有标志结束的分号

ZYNQ sdk使用 c/c++ 指针记录

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-14 17:13:01
1.简述 像ZYNQ这样的soc fpga期间,开发起来真的太难,能熟练开发fpga已经很难了,现在fpga硬件逻辑需要开发,还要开发arm。现在使用zynq fpga 一年多了,断断续续用zynq做项目,用起来很爽同时也很酸爽。今天专门记一下c/c++ 的指针,这也不难,就是容易迷糊,一周不写c代码,指针就不会用了,没次都要花点时间重新捡起来,为了提高效率,还是总结一下,结合vivado 的sdk开发工具记录。 2.正文 1)准备 vivado搭建一个简单PS 的工程(记得勾选uart),生成bit,导出硬件,启动sdk,新建helloworld的工程就行。然后跑一下,看串口是否能打印helloworld。如果可以,这就成功搭建工程了。 2)开始 (1) 进入debug模式,页面如下,黄框是现在代码运行的位置,我们要点击红框中的按钮进行单步调试(这个对熟悉单片机或者arm开发的来说很熟悉),我们简单在hello world源码上简单添加蓝框中的代码。可以看到粉红框中有变量的信息,现在的值是不对的,因为data那行代码还没运行,点击红框,值就会变成我们代码赋的值。 (2)点击后,可以看到data值变了,这是十进制的数,可以用计算器转成16进制数,是一样的。把鼠标放到data上面会显示data信息,可以知道data地址,如红框中的。在右下角,点击进入memory ,点击加号

数据结构与算法(2)

a 夏天 提交于 2020-02-14 01:51:24
1 双向线性链表 2 单向线性链表 1 双向线性链表 1.1 问题 双向线性链表是采用链式存储的方式存储的线性表。链式存储结构是由一系列结点(链表中每一个元素称为结点)组成,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储当前结点的前驱结点和后继结点地址的指针域,结点是在有数据时动态生成的,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 1.2 方案 双向线性链表的基本操作包括: 初始化操作,在初始化操作中将双向线性链表的头指针指空。 求表长,求表长操作是计算出双向线性链表中结点的个数。 取双向线性链表中指定位置的结点,即给定双向线性链表中的第几个结点,求其值。 查找结点,在双向线性链表中查找值为x的结点,并返回该结点在双向线性链表中的位置。若双向线性链表中有多个结点的值和x相同,则返回首次找到的结点位;若双向线性链表中没有结点的值为x,则返回一个NULL表示查找失败。 插入结点,在双向线性链表的第i个结点前插入一个值为x的新结点。 删除结点,删除双向线性链表的第i个结点。 1.3 步骤 实现此案例需要按照如下步骤进行。 步骤一:定义双向线性链表 在C语言中: 1)定义一个变量来表示双向线性链表中某个结点的数据。 2)定义两个指针来表示该结点的前驱结点和后继结点的地址。 3

智能指针类模板

老子叫甜甜 提交于 2020-02-14 01:48:24
文章目录 1 智能指针介绍 1.1 智能指针的意义 1.2 STL中的智能指针 1.3 Qt中的智能指针 2 创建智能指针类模板 1 智能指针介绍 1.1 智能指针的意义 智能指针具有如下意义: 现代C++开发库中最重要的类模板之一。 C++中自动内存管理的主要手段。 能够很大程度上避开内存相关的问题。 1.2 STL中的智能指针 STL中的智能指针auto_ptr: 生命周期结束时,销毁指向的内存空间。 不能指向堆数组,只能指向堆对象(变量)。 一片堆空间只属于一个智能指针对象。 多个智能指针对象不能指向同一片堆空间。 编程实验:auto_ptr使用初探 # include <iostream> # include <string> # include <memory> using namespace std ; class Test { string m_name ; public : Test ( const char * name ) { cout << "Hello, " << name << "." << endl ; m_name = name ; } void print ( ) { cout << "I'm " << m_name << "." << endl ; } ~ Test ( ) { cout << "Goodbye, " << m_name << ".

java基本的知识第一天。

我们两清 提交于 2020-02-14 00:33:45
本博客的所有文均为自己学习的笔记,学习用到的资料的内容并非原创,从原作者处学习。 1个字节是8位 然后的话用byte表示 然后的话K和byte的关系是1024 也就是说k这个单位对应的1024是和byte相比的。 这里可以看到就是各种数据类型 然后的话和我之前看的不一样的地方是:python的话不怎么注重数据类型的 直接就用了。 这里可以看到就是各个占的字节数,key是字节的数量,也就是说:对于byte来说,是1个字节 反而short的话比byte还多了 而int是4个字节 float的话也是四个字节 double是8个。 char的话是两个字节。 这里说的是它的存储,就是存储的空间的大小的问题。short反而比byte要多,单位是字节来的。 这里的话说的是:每个数据类型能够表示的数的最大和最小的问题,至于具体的话为什么说正的数比负的数是少1的关系呢,我个人解释来说如果符号位是0 后面全部填的都是1的话 那么加起来确实就是最大值-1, 但是的话为什么负可以到最小的数呢? 我认为是不是因为10000000这样表示的是:-128的问题呢?这里我还存疑 知道的话每种数据类型表示的最大和最小的数是多少先。 这里是说:布尔类型是用boolean来表示 然后的话char是字符型的。 这里的话是说有个var类型 就是可以不写变量类型。 括号进行类型的强制转换,上课的时候老师好像说的是:C+