指针变量

prototype pattern原型模式

两盒软妹~` 提交于 2020-02-28 07:27:10
定义 原型模式是一种非常简单的是模式,属于创建型设计模式的一种。原型模式(Prototype)即应用于“复制”操作的模式,此模式最初定义在《设计模式》(Addison-Wesley,1994),定义为: “ 使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象 ” 。简单来理解就是根据这个原型创建新的对象,这种创建是指深复制,得到一份新的内存资源,而不是一个新的指针引用。我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑对于快速的创建一个新的对象是一种非常有效的方式。 结构 原型模式结构如下页上图所示: 客户(Client):使用原型对象的客户程序,客服端知道抽象的Prototype类 抽象原型(Prototype):规定了具体原型对象必须实现的接口(如果要提供深拷贝,则必须具有实现clone的规定) 具体原型(ConcretePrototype):从抽象原型派生而来,是客户程序使用的对象,即被复制的对象。此角色需要实现抽象原型角色所要求的接口。 Prototype类中包括一个Clone方法,Client知道Prototype,调用其复制方法clone即可得到多个实例,不需要手工去创建这些实例。

C++11 智能指针概述

假装没事ソ 提交于 2020-02-28 05:15:02
0.什么是智能指针? 智能指针是一种用来管理资源指针的特殊对象,对象中有一个成员变量用来保存动态创建的裸指针,通过重载operator->方法实现类似于裸指针的使用方式。 1.智能指针的作用是什么? 我们平时使用C++编写代码时,动态内存管理是我们时刻关注的重点。动态内存管理不好,容易出现下述三类问题: 1、野指针(空悬指针) 一些内存单元已经被释放,但是指向这些内存的指针还在使用,这些已经释放的内存有可能被系统重新分配给应用使用,此时再使用野指针,会造成无法预测的错误。 int *p = new int(10); delete p; // 释放后再次访问,无法预测结果 cout << *p << endl; 2、重复释放 程序试图释放已经被释放的资源,或者已经被重新分配的资源。 int *p = new int(10); delete p; // 重复释放,运行时报错 delete p; 3、内存泄露 不再使用的动态内存没有进行释放,便会造成内存泄露。如果程序多次存在内存泄露行为,会导致内存占用急剧增长,最终程序会因为无法申请到足够的空闲内存而异常退出。 void TestRelease() { int* p = new int(10); // 未释放p return; } 这三类问题严重影响程序的高可用性。但是像JAVA这样的语言不会存在这样的问题

一款国产静态程序检查工具与Converity的对比测试

馋奶兔 提交于 2020-02-28 00:42:25
源伞科技Pinpoint,作为BAT都在使用的一款静态代码分析工具,到底有什么领先于其他厂商的能力? 1. 扩展和部署功能对比 源伞科技Pinpoint现有的检查器可以通过简单的json配置文件扩展业务逻辑。比如敏感数据泄露到日志检查器,企业或许有很多自己的日志打印函数,我们可以通过人工配置指定,即可提高检测质量。 如果不想人工配置,Pinpoint有未公开发布的库函数学习工具,可以通过线下分析企业代码库自动学习和生成上述配置文件。 Pinpoint对分布式多机扫描部署支持比 Coverity 好,并发扫描和结果合并x性能也比 Coverity 更强,能更好支持BAT级别的数千代码库扫描( 已在BT部署验证 )。 2. 分析能力对比 本节补充一些人工构造的例子介绍Pinpoint在分析能力上比Coverity强的部分。本节所有代码示例,Coverity均有误报或漏报。 Pinpoint更懂数据流 精确深度的指针分析,深入分析内存中的程序行为 高深度高精度函数调用链分析,查找跨越多层函数的深度问题 示例代码如下: (链接: https://www.sourcebrella.com/online-showcase/?id=5b483da03a21cd078346028f),此示例代码基于空指针(Null Pointer Dereference)问题检测。 准备代码:

部分C2教学笔记(数组指针)

旧时模样 提交于 2020-02-27 23:47:17
C2-01数组知识点 一、声明数组 1.元素的概念 2.Int a[10]四部分 Int——数据类型:元素的数据类型 a——数组名: ① 是一个指针常量而不是变量,值为数组的首地址=&a[0] ② 注意重名问题int a;int a[10]不行 charb[5];floatb[10]不行 10——下标: ① 数组的下标表示:数组中元素个数 ② 数组中元素的下标从0开始 []——下标运算符 3.同时声明多个数组 二、数组的赋值 1.赋值符号赋值,数组的初始化: =与{},二者缺一不可。 两个数之间用,隔开 3+1 种形式 3: 完整 :Int a[10]={1,2,3,4,5,6,7,8,9,10}; 省略下标数 :Int a[]={1,2,3,4,5,6,7,8,9,10}; 省略部分元素 :Int a[10]={1,2,3,4,5,6};只给前6个元素赋值,其余元素赋值为0 (注:只有这里这种情况会默认给没有初值的值赋值为0,只做声明int a[10];不会给整个数 组 都给个0作为初值) 1: (其实属于第三种) 均赋值为0时 Int a[10]={0}; (注意:int a[10]={1};并不会都赋值为1,这属于3+1中3的第三种) 2.输入值:利用for循环cin 三、输出:利用for循环 四、Sizeof(数据类型) 不同的计算机和不同的C编译器下各数据类型所占空间不同

第十次实验总结

╄→гoц情女王★ 提交于 2020-02-27 20:47:30
知识点总结: 1.这周新开的章节是指针。 对于指针变量 ·一般形式:类型名 *指针变量名; ·定义指针变量要使用指针声明符*; 例如:int i,*p; (声明变量i是int类型,变量p是指向int型变量的指针。指针值可以是特殊的地址0,也可以是一个代表机器地址的正整数。) ·定义多个指针变量时,每一个指针变量前面都必须加上*; 注:指针变量的类型不是指指针变量本事的类型,而是指它所指向的变量的数据类型。无论何种类型的指针变量,它们都是用来存放地址的,因此指针变量自身所占的内存空间大小和它所指向的变量数据类型无关,尽管不同类型的变量所占的内存空间不同,但不同类型指针变量所占的内存空间大小都是相同的。 ·指针变量被定义后,必须将指针变量和一个特定的变量进行关联后才可以使用它,也就是说,指针变量也要先赋值再使用,当然指针变量被赋的值应该是地址。 ·定义指针变量:指针变量名是一个标识符,要按照c标识符的命名规则对指针变量进行命名。指针变量的数据类型是它所指向的变量的类型,一般情况下一旦指针变量的类型被确定后,它只能指向同种类型的变量。在定义指针变量是需要使用指针声明符*,但指针声明符并不是指针的组成部分。例如:定义 int *p;说明p是指针变量,而不是*p。 2.指针的基本运算 ·取地址运算和间接访问运算:单目运算符&用于给出变量的地址。(指针的类型和它所指向变量的类型必须相同)

C基础(2)

巧了我就是萌 提交于 2020-02-27 19:03:54
一、指针 指针是一个unsigned类型的整数。 指针变量由于存放指针。 指针变量的加减法是针对基类型而言的 eg int *p; p+1所指的是下一个int型变量 注意:指针减法的结果是相差了几个基类型 如 q = 2068708,p = 268688;q-p = 5; 二、引用 引用是C++的语法。 注意: 区分引用和取地址。 常量不能使用引用。 交换的几种错误: void swap(int *a,int *b){ int* temp; *temp = *a; *a = *b; *b = *temp; } //错误原因:未初始化temp void swap(int *a,int *b){ int* temp = a; a = b; b = temp; } //错误原因:传入的a,b只是地址的副本,类似无符号整型数 void swap(int* &a,int* &b){ int* temp = a; a = b; b = temp; } //正确,利用引用来交换值 三、结构体 struct a{ … }b,c; a是结构体名字,b,c是变量名 C++构造函数: struct student{ int id; char gender; student(){}//默认构造函数 } struct student{ int id; char gender; student(int _id

C++函数的理解思考

不羁岁月 提交于 2020-02-27 14:19:28
函数指针调用方式 void testmy(int k) { cout << "testzhixing " <<k << endl; } int _tmain(int argc, _TCHAR* argv[]) { typedef void(*testmy1)(int);// 定义函数指针相当于一个新的 struct testmy1 p; // 声明指针变量 testmy(1); p = &testmy; p(1); //---调用方式二 testmy(2); //--调用3 void (*ptr)(int); // 声明函数指针 ptr = testmy; ptr(3); } 这种方式一般调用dll用的多 typedef void(*testmy1)(int);// 定义函数指针相当于一个新的 struct testmy1 p; // 声明指针变量 关于这种方式 参考函数指针 为什么要 (*testmy1) 为什么前面加个* 这个确实不是狠明白 但是这种结构的定义反汇编也没有代码,先这样写着把 还有函数testmy的调用是 test() testmy是这个函数的首地址 函数调用汇编相当于call 就是跳到testmy函数地址里面执行 当然首地址肯定是保护堆栈现场的操作 不可能直入正题 来源: https://www.cnblogs.com/xuexidememeda/p

结构指针

ぐ巨炮叔叔 提交于 2020-02-27 13:14:03
1.结构作为函数参数 int numberOfDays(struct date d) 整个结构可以作为参数的值传入函数 这时候是在函数内新建一个结构变量,并复制调用这个结构的值 也可以返回一个结构 这与数组完全不同 struct date { int month ; int day ; int year ; } ; bool isLeap ( struct date d ) ; //判断这一天所在的年份是不是闰年 #include <stdbool.h> int numberOfDays ( struct date d ) ; int main ( int argc , char const * argv ) { struct date today , tomorrow ; printf ( "Enter today's date(mm dd yyyy):" ) ; scanf ( "%i %i %i" , & today . month , & today . day , & today . year ) ; if ( today . day != numberOfDays ( today ) ) { tomorrow . day = today . day + 1 ; tomorrow . month = today . month ; tomorrow . year =

C++中指针和引用的区别

和自甴很熟 提交于 2020-02-27 10:27:17
1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来 的变量实质上是同一个东西,只不过是原变量的一个别名而已。如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。 而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单 元。 (2)引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化。 (3)可以有const指针,但是没有const引用; (4)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的) (5)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化; (6)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。 (7)”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小; (8)指针和引用的自增(++)运算意义不一样; (9)如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏; 来源: https://www.cnblogs.com

成员变量是指针的注意点

耗尽温柔 提交于 2020-02-27 07:10:17
若使用成员拷贝,则指针指向同一块区域,不行,目的是指向拷贝一份相同存储空间区域过来 若使用赋值运算符,则需要判断传入的参数不是自己,若是自己则指针指向的那份待拷贝空间没了,即使保留一段时间,但是再次拷贝出空间时候,值会消失,接下来没了拷贝的值 来源: CSDN 作者: Tine Chan 链接: https://blog.csdn.net/chanleoo/article/details/104457850