指针

std::function与std::bind 函数指针

不羁岁月 提交于 2020-02-08 18:20:29
c++ function bind function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时。 std::function可以绑定到全局函数/类静态成员函数(类静态成员函数与全局函数没有区别),如果要绑定到类的非静态成员函数,则需要使用std::bind。 [cpp] view plain copy #include <iostream> #include <functional> using namespace std; typedef std::function< void ()> fp; void g_fun() { cout<< "g_fun()" <<endl; } class A { public : static void A_fun_static() { cout<< "A_fun_static()" <<endl; } void A_fun() { cout<< "A_fun()" <<endl; } void A_fun_int( int i) { cout<< "A_fun_int() " <<i<<endl; } //非静态类成员,因为含有this指针,所以需要使用bind void init() { fp fp1=std::bind(&A::A_fun, this );

空悬指针和野指针

别来无恙 提交于 2020-02-08 17:17:08
前言 以前经常把这两个概念混为一谈,虽然这它们的概念类似,有一定的相似性,但是各自的成因和解决防范方法都是不同的,特记录在此。 空悬指针 定义 一个原生指针分配内存后,它并没有探测内存是否已经被释放或者被损坏的能力。当所管理的内存被释放后,若这个指针没有被销毁或置为NULL,它就成了一个空悬指针。 危害 可能会出现随机的错误,甚至导致程序崩溃,而且这种问题一般很难定位,特别是在大型工程里。 解决方法 使用weak_ptr和shared_ptr配套可以解决“不知道对象是否还活着”的问题。 野指针 定义 没有初始化过的指针,可能被编译器随机赋值 危害 基本同上 解决方法 尽量避免使用原生指针,使用智能指针代替它,如果必须使用,在一定要初始化它。 来源: https://www.cnblogs.com/jo3yzhu/p/12283744.html

堆栈里的悄悄话——智能指针

折月煮酒 提交于 2020-02-08 16:44:19
栈里的对象 "构造完毕,请睁开眼吧!",迷迷糊糊中,听着这个声音,我睁开了眼睛,一位小哥映入眼帘。 “你是谁?我是谁?这又是什么地方?”,我的大脑一片空白。 “你是一个C++对象,这里是栈空间。我是创建你的线程,你先待着,一会儿会用到你,拜~” “唉,等一下...”,还没等我回过神,小哥已经走远。 环顾四周,这个叫栈的地方,有好多好多的对象,大小不一,不远处还有一个巨无霸对象足足有好几千字节。 “哇!好大一个对象!”,我不禁发出了惊叹。 “一看就是没见过世面的,这才多小的个头,就在那大呼小叫的”,突然传来一个声音。 “谁在说话?”,我四处望去,却没发现动静。 “往哪看呢,没那么远,就在你旁边”,我这才注意到眼皮底下有个小个子在说话。 “你才8个字节的对象,好大的口气!” “唉,纠正一下,我可不是对象哦,我只是一个指针,我指向的对象那才叫大呢!” 原来这小个子是个指针,顺着他指向的地址望去,果然有一庞然大物,虽不见其全身,估摸着至少也有几MB的大小。 “唉,你指向的对象为何不和我们在一块儿,我看那地方好像不属于栈的地界儿了”。 “说你没见过世面,你还不承认。咱们这栈空间有限,哪里装得下那么多大对象,他们那里叫 堆区 ,一般有身份的对象都放在那边的。那里的对象都是通过new关键字生成的,你们可没这待遇哦,还有...” “嘘!先别说话,你看线程小哥在干嘛?”,看到之前的小哥去了堆区

指针的引用

会有一股神秘感。 提交于 2020-02-08 14:33:09
# include <iostream> # include <cstring> using namespace std ; //指针的引用 struct teacher { int id ; char name [ 64 ] ; } ; //使用二级指针生成和释放 int get_mem ( teacher * * tpp ) { teacher * tp = NULL ; tp = ( teacher * ) malloc ( sizeof ( teacher ) ) ; if ( tp == NULL ) { return - 1 ; } tp - > id = 10 ; strcpy ( tp - > name , "hahah" ) ; * tpp = tp ; return 0 ; } //释放 void free_teacher ( teacher * * tpp ) { if ( tpp == NULL ) { return ; } teacher * tp = * tpp ; if ( tp != NULL ) { free ( tp ) ; * tpp = NULL ; } } //使用引用生成和释放 int get_mem2 ( teacher * & tp ) { tp = ( teacher * ) malloc ( sizeof ( teacher )

赋值操作符和拷贝构造函数

南笙酒味 提交于 2020-02-08 11:25:33
今天在看一个消息结构的定义类时,有一个这样的接口 WF_MSG & operator=(const WF_MSG & _msg); 开始不是很明白,后来才知道这是赋值操作符,也通过这个深刻了解了赋值操作符,因为还定义了一个unsigned char * m_pMsgBuffer; /// 消息缓存指针 的指针,一般默认的赋值操作符是浅拷贝,而因为有消息缓存指针的变量,当这个消息类有两个对象时,如果一个消息赋值给另外一个消息,则会涉及到深拷贝的问题,所以要重新定义赋值操作符 这里有一博客,叙述的很详细,给大家分享下: 赋值运算符和复制构造函数都是用已存在的B对象来创建另一个对象A。不同之处在于:赋值运算符处理两个已有对象,即赋值前B应该是存在的;复制构造函数是生成一个全新的对象,即调用复制构造函数之前A不存在。 CTemp a(b); //复制构造函数,C++风格的初始化 CTemp a=b; //仍然是复制构造函数,不过这种风格只是为了与C兼容,与上面的效果一样 在这之前a不存在,或者说还未构造好。 CTemp a; a=b; //赋值运算符 在这之前a已经通过默认构造函数构造完成。 实例总结: 重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符。 以下讨论中将用到的例子: class CExample { public: CExample(){pBuffer

第11次作业

泄露秘密 提交于 2020-02-08 10:53:37
本次课学到的知识点: 指针是c语言中非常重要的概念,使用指针可以对复杂数据进行处理,能对计算机的内存分配进行控制,在函数调用中使用指针还可以返回多个值。 指针访问内存和操纵地址,是通过变量的地址进行操控。 指针变量定义: 类型名 *指针变量名; 类型名指定指针变量所指向的变量的类型,必须是有效数据类型 不同类型指针变量所占的内存空间大小相同。 冒泡排序 实验过程中遇到的问题及解决方法: 1.对指针没有听懂,和地址等概念理解不够充分 2.多看书,上网看别人写的代码从中理解 实验心得体会及本章学习总结: 指针部分完全没有听懂,还是得看书和查资料 几个问题的思考与回答: (1)两个相同类型的指针变量能不能相加?为什么? 答:不能。因为相加后的值可能超出,不在这个地址内,是毫无意义的,且是不被允许的。 (2)在使用scanf()函数时,输入参数列表需要使用取地址操作符&,但当参数为字符数组名时并没有使用,为什么?如果在字符数组名前加上取地址操作符&,会发生什么? 答:因为字符数组名的值是一个特殊的固定地址,可以看作是常量指针,因此不需要再使用 取地址符来获取该数组的地址。 如果在字符数组名str 前加上取地址操作符&,那么对其取地址&str 可以看做是这个数 组的第一个元素的地址,由于数组地址和数组第一个元素的地址相同,所以&str 表示地址值和str 表示的地址值是相等的。对scanf(

线性表的链式存储结构

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-08 10:52:23
特点:用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置。 存取数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称为指针或链。这两部分信息组成数据元素称为存储映像,称为结点。 单链表 因为每个结点中只包含一个指针域,所以称为单链表。 我们把链表中第一个结点的存储位置叫做头指针,最后一个结点指针为空(NULL)。 头指针: - 头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。 - 头指针具有标识作用,所以常用头指针冠以链表的名字,(指针变量的名字)。 - 无论链表是否为空,头指针均不为空。 - 头指针是链表的必要元素。 头结点: - 头结点是为了操作的统一和方便而设立的,放在第一个元素的结点之前,其数据域一般无意义(但也可以用来存放链表的长度) - 有了头结点,对于在第一元素结点前插入结点和删除第一结点起操作与其他结点的操作就统一了。 - 头结点不是链表的必要元素。 PS:我们所看到的结点是由存放数据元素的数据域和存放后继结点地址的指针域组成。 来源: https://www.cnblogs.com/strator/p/7219915.html

C++ 的const使用总结

我的梦境 提交于 2020-02-08 09:48:00
const修饰符 常量的定义: 在变量前面添加修饰符 const。 1,const修饰基本数据类型构成常量。 1,const int a = 5. a是不能修改的。 2,int b = 5; const int a = b; b发生变化,a不会发生变化。 2,const修饰指针。 1,常量指针。 指向常量的指针。 const int a = 10; //常量 const int * p = &a; //常量指针 *p 不能被修改 p的值可以被修改 应用:strlen(const char * str); 不能对指针指向的常量进行修改,从而保护了数据 2,指针常量。 指针本身为常量,只能指向固定的位置。 int a = 10,b = 20; int *const p = &a; p是不能修改的 *p可以修改 3,指向常量的指针常量。指针指向了常量,指针本身也是常量。 const int a = 1,b = 2; const int * const p = &a; p不能修改 *p也不能被修改 3,const修饰引用。 int a = 10; const int & ra = a; ra = 5; //error a = 5; const修饰引用,const修饰的引用变量不能被修改,a的值可以被修改。 使用场景,一般用在函数的形参的传入过程中。void fun(const string

ca29a_demo_c++指针和数组_如何使用指针访问数组

这一生的挚爱 提交于 2020-02-08 09:43:46
/*29_CppPrimer_指针和数组 使用指针访问数组 指针的算术操作 解引用和指针算术操作之间的相互作用 下标和指针 计算数组的超出末端指针 输出数组元素 指针是数组的迭代器 */ /*29_CppPrimer_指针和数组txwtech 使用指针访问数组 指针的算术操作 解引用和指针算术操作之间的相互作用 下标和指针 计算数组的超出末端指针 输出数组元素 指针是数组的迭代器 */ #include <iostream> #include <vector> using namespace std; int main() { int ia[] = {9,2,4,6,8}; int *ip = ia; cout << *ia << endl; cout << *ip << endl; ip = &ia[4]; //ip=&ia[0];//同ip=ia; cout << *ip << endl; ip = ia; int *ip2 = ip + 4;//同 ip = &ia[4];//*ip2 = ia + 4; cout << *ip2 << endl; int *ip3 = ip + 10; //下标越界了,数据错误 cout << *ip3 << endl;//下标越界了,数据错误 ptrdiff_t n = ip2 - ip;//数据元素间隔几个数据,n=4 cout <<

『嗨威说』数据结构 - 第三章学习内容小结

删除回忆录丶 提交于 2020-02-08 09:37:43
本文内容: 本章内容小结 完成作业或实践时解决困难的经验分享 参考资料、说明推荐理由及列出相关链接(或书目名称,具体页码) 目前学习过程中存在的困难,待解决或待改进的问题 接下来的目标 一、本章内容小结:(栈与队列)   (1)基本概念: 栈(Stack): 只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是限定这种线性表只能在某一端进行插入和删除操作 栈顶(top): 线性表允许进行插入和删除的那一端。(开口的那一端) 栈底(bottom): 固定的,不允许进行插入和删除的另一端。(封死的那一端) 空栈: 不含任何元素的空表。 栈的两种表示方式: 栈的本质是线性表,那么它就同样有线性表的两种表示形式:顺序栈 和 链式栈(简称“链栈”) 两者的区别:存储的数据元素在物理结构上是否是相互紧挨着的。顺序栈存储元素预先申请连续的存储单元;链栈需要即申请,数据元素不紧挨着。 栈的“上溢”和“下溢”问题: “上溢”:在栈已经存满数据元素的情况下,如果继续向栈内存入数据,栈存储就会出错。(栈满还存会“上溢”) “下溢”:在栈内为空的状态下,如果对栈继续进行取数据的操作,就会出错。(栈空再取会“下溢”) 对于栈的两种表示方式来说,顺序栈两种情况都有可能发生;而链栈由于“随时需要,随时申请空间”的存储结构,不会出现“上溢”的情况。 栈的基本操作:   InitStack(&S)