指针

2020最新版C/C++学习路线图--C高级编程重点知识

点点圈 提交于 2020-01-25 18:31:41
黑马程序员C/C++学习路线图大纲中第二阶段的学习是C高级编程的学习:主要介绍了C/C++学习路线图的C高级编程的学习目标,C/C++学习路线图的C高级编程的市场价值,C/C++学习路线图的C高级编程的重点知识。 C/C++学习路线图中的C高级编程部分的学习视频可以在黑马程序员视频库中找到自学教程。 C/C++学习路线图中C高级编程的技术要点: 内存分区、函数调用模型;指针高级;函数指针与回调函数;数据结构与链表;递归函数;接口的封装和设计;数据结构与算法。 内存分区、函数调用模型 1.数据类型、变量的含义 2.内存四区特点 3.函数的调用模型 4.内存操作函数 5.宏定义与预处理 指针高级 1.指针基本使用 2.指针的步长的概念 3.指针简介赋值 4.指针以及多级指针做函数参数的特性与使用 5.通过指针操作字符串 6.const类型修饰符 7.位的逻辑运算符 8.移位运算符 9.数组指针与指针数组 10.多维数组做函数参数 11.结构体嵌套一级指针 12.结构体嵌套二级指针 13.浅拷贝深拷贝 函数指针与回调函数 1.封装和设计的思想 2.函数指针定义的三种方式 3.回调函数 数据结构与链表 1.链表的基本概念 2.单链表的相关操作 递归函数 1.递归函数的概念 2.递归的使用 接口的封装和设计 1.函数的封装设计 2.解耦合的设计理念 3.模块实现与业务分离的思想

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

拟墨画扇 提交于 2020-01-25 18:22:32
题目 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路 设置快慢指针,都从链表头出发,快指针每次走两步,慢指针一次走一步,假如有环,一定相遇于环中某点(结论1)。接着让两个指针分别从相遇点和链表头出发,两者都改为每次走一步,最终相遇于环入口(结论2)。以下是两个结论证明: 两个结论: 1、设置快慢指针,假如有环,他们最后一定相遇。 2、两个指针分别从链表头和相遇点继续出发,每次走一步,最后一定相遇与环入口。 证明结论1:设置快慢指针fast和low,fast每次走两步,low每次走一步。假如有环,两者一定会相遇(因为low一旦进环,可看作fast在后面追赶low的过程,每次两者都接近一步,最后一定能追上)。 证明结论2: 设: 链表头到环入口长度为--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圈

实验十:指针(1)

心不动则不痛 提交于 2020-01-25 16:49:30
一、实验内容 1 .计算两数的和与差。 要求自定义一个函数 void sum_diff( float op1, float op2, float *psum, float *pdiff ); 其中 op1 和 op2 是输入的两个实数, *psum 和 *pdiff 是计算得出的和与差。 编写主函数,并在其中调用函数 sum_diff (),试编写相应程序。 2 . 利用指针找最大值 : 要求自定义一个函数 void findmax( int *px, int *py, int *pmax ); 其中 px 和 px 是用户传入的两个整数的指针。函数 findmax 应找出两个指针所指向的整数中的最大值,存放在 pmax 指向的位置。编写主函数,并在其中调用函数 findmax ()。试编写相应程序。 3 .拆分实数的整数与小数部分 :要求自定义一个函数 Void splitfloat (float x, int *intpart,float *fracpart); 其中 x 是被拆分的实数, *intpart 和 *fracpart 分别是将实数 x 拆分出来的整数部分与小数部分。编写主函数,并在其中调用函数 splitfoat() 。试编写相应程序。 实验要求: 1.实验代码可以直接发布到博客,也可以按照助教老师的要求上传到coding。 2.发布一篇随笔

chapter3 异常

耗尽温柔 提交于 2020-01-25 16:20:27
大纲: 1、普通函数异常发生,防止局部资源泄漏 2、构造函数异常发生,防止局部资源泄漏 3、禁止析构函数发生的异常传递到调用者 4、抛出异常、传递参数、调用虚函数差别 5、比较异常传递方式 6、慎用异常规格 1、普通函数异常发生,防止局部资源泄漏 异常处理机制: 没有任何的异常捕获机制,将导致程序的控制权到调用者上,原有程序逻辑将不会被执行。相反,如果有异常捕获机制,我们就可以控制程序的执行逻辑。 局部资源,这里指代指针所指向堆资源。 解决方法: 用对象代替指针,对象的析构函数内释放资源。当函数返回时(正常/异常),函数体内的局部对象确保会调用其析构函数来释放资源。 标准类库中auto_ptr<T>可用来支持上述阐述: 构造函数内,使指针指向堆对象 析构函数内,释放堆对象及其占用空间 借鉴auto_ptr<T>的实现方法,对于任何资源,我们将其关联到一个对象上,析构函数内实现资源的释放。 2、构造函数异常发生,防止局部资源泄漏 构造函数内何时发生异常? 在构造函数内尝试分配内存并初始化对象,内存不够,将引发异常,此时程序的控制权将转至调用构造函数的地方。构造函数没有完全被执行, C++对于不完整的对象,在离开其生存空间时,将不会执行对象的析构函数,资源泄漏发生了。 解决方法: 在构造函数内部捕获到异常,释放资源,在向上传递异常。而不是直接将异常向上传递,一旦向上传递

带你重新认识指针(下)

天大地大妈咪最大 提交于 2020-01-25 13:50:27
真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血。这是怎样的哀痛者和幸福者?然而造化又常常为庸人设计,以时间的流驶,来洗涤旧迹,仅使留下淡红的血色和微漠的悲哀。在这淡红的血色和微漠的悲哀中,又给人暂得偷生,维持着这似人非人的世界。我不知道这样的世界何时是一个尽头!我们还在这样的世上活着;我也早觉得有写一点东西的必要了。 ——鲁迅 <p align="center">本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。</p> <h4 align="center"><a href=" https://github.com/midou-tech/articles " target="_blank"> https://github.com/midou-tech/articles</a></h4&gt ; <h4 style="color:red;text-align:center">点关注,不迷路!!! </h4>   看完我上一篇指针的讲解之后很多同学反馈很不错,有网友给私信说之前在大学里面一直搞不懂指针的问题,说到指针都是云里雾里,老师讲的也是很难听懂 , 点击即可进入 指针(上) 。也有很多网友表示非常期待指针下的文章,所以我就马不停蹄的继续写 ,下 主要讲解指针的特性以及指针安全问题。 指针的特性 指针和常量  先说下什么是常量,常量就是不可变的量

数组与链表

时光毁灭记忆、已成空白 提交于 2020-01-25 12:11:29
引子 假设你去看演出,需要将东西寄存。寄存处有一个柜子,柜子有很多抽屉。 计算机就像是很多抽屉的集合体,每个抽屉都有地址。 fe0ffeeb是一个内存单元的地址。 需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存储多项数据时,有两种基本方式——数组和链表。但它们并非都适用于所有的情形,因此知道它们的差别很重要。接下来介绍数组和链表以及它们的优缺点。 数组 有时候,需要在内存中存储一系列元素。假设你要编写一个管理待办事项的应用程序,为此需要将这些待办事项存储在内存中。 我们先将待办事项存储在数组中。 使用数组意味着所有待办事项在内存中都是相连的 (紧靠在一起的)。 现在假设你要添加第四个待办事项,但后面的那个抽屉放着别人的东西! 这就像你与朋友去看电影,找到地方就坐后又来了一位朋友,但原来坐的地方没有空位置,只得再找一个可坐下所有人的地方。在这种情况下,你需要请求计算机重新分配一块可容纳4个待办事项的内存,再将所有待办事项都移到那里。如果又来了一位朋友,而当前坐的地方也没有空位,你们就得再次转移!真是太麻烦了。同样,在数组中添加新元素也可能很麻烦。如果没有了空间,就得移到内存的其他地方,因此添加新元素的速度会很慢。 再以整型数组为例,数组的存储形式如下图所示。正如军队里的士兵存在编号一样,数组中的每一个元素也有着自己的下标,只不过这个下标从0开始

【C++】构造函数和this指针

只愿长相守 提交于 2020-01-25 10:28:49
通常this指针在对象构造完毕后才完全生成,而在构造函数执行过程中,对象还没有完全生成,所以this指针也是没有完全生成的,在构造函数中使用this指针会存在问题,应该尽量避免。 构造函数中可以访问对象中已经初始化的成员(成员初始化是有顺序的),但尽量不要调用对象方法,因为调用方法的时候会隐含使用this指针。 在某些应用中会存在这样的对象,他的成员变量需要用对象的this指针进行初始化: class A { B b; }; class B { A* a; }; A类的构造函数可以写成: A(): b(this) 这样会违反构造函数中尽量不使用this指针的规范,一种替代的方法是,在A类中增加Init方法,在此方法中设置B的成员变量值为A对象的this指针,Init方法在A对象构造完后调用,从而this指针是完整的: class A { B b; A() { } void Init() { b.SetMemberA(this); } }; class B { A* a; void SetMemberA(A* pa) { a = pa; } }; 来源: CSDN 作者: 摩羯座程序员 链接: https://blog.csdn.net/qq_43248127/article/details/103772795

ctypes 指针类型 byref pointer POINTER

三世轮回 提交于 2020-01-25 08:46:55
byref 并不会构造一个指针对象,因此速度比 pointer 快, 只能作为导出函数的实参使用 。其 _obj 是只读属性,不能更改。 pointer 会构造一个指针对象。.contents 属性即其所指的对象,但是指向是能够变动的。相当于 int *ptr = n; ptr = &m; //指向可以变化 对于一个包含如下函数,名为 lib.so 动态库: void change(float* ptr, float value) { *ptr = value; } ptr.contents 更改指针的指向,change 函数调用后,c的值并没有变化,变化的是 ptr.contents 的值。 ctypes.addressof 返回 C 实例的地址,可以查看区别: ctypes.addressof(ptr.contents) ctypes.addressof(c) POINTER 返回类型对象,用来给 restype 和 argtypes 指定函数的参数和返回值的类型用。 ctypes.POINTER(ctypes.c_float) == type(ptr) #True ptr的类型可通过 POINTER 获得 如果不指定,默认的类型都将被当做是整形。实参类型(除了 None,integer,stringbytes,可隐式转换)和返回值的类型用 ctypes.c_

数据结构第五篇——线性表的链式存储之循环链表

你说的曾经没有我的故事 提交于 2020-01-25 05:23:34
♥注:未经博主同意,不得转载。   链表是另一种形式的链式存储结构,它是线性链表的一种变形。在线性链表中,每个结点的指针都指向它的下一个结点,最后一个结点的指针域为空,表示链表的结束。若使最后一个结点的指针指向头结点,则链表呈环状,这样的链表称为 循环链表 。 循环链表当然也分为 单链表 和 双向列表 。 通常情况下,在循环链表中设立尾指针而不设头指针,可使某些操作简化。 循环链表的定义和操作与单链表类似,只是循环结束条件有所不同,下面只给出单循环链表的定义和部分操作,至于双向循环链表可能会在以后的项目中出现,到时再进一步探讨。 单循环链表定义如下: 1 typedef int Data; 2 3 struct Node 4 { 5 Data data; //数据 6 Node* next; //指向后继的指针 7 }; 8 9 class CList 10 { 11 Node* head; //创建头结点 12 public: 13 CList() //构造函数 14 { 15 head = new Node; 16 head->next = head; //头尾相接 17 } 18 ~CList(); //析构函数 19 20 Data GetElem(int i); //取第i个元素的值 21 bool IsEmpty(); //判断是否为空链表 22 void Create

数据结构线性表3---单链表

大城市里の小女人 提交于 2020-01-25 04:55:33
今天我说的内容是单链表,所以提前来No pic say a J8 环节! 其实大家都知道,单链表就是我们所说的链式存储结构当中最简单,也是最重要的一个内容。 所以单链表的图形描述就是下图。 先别着急,看不懂也别慌。我先说几个注意事项,再给你细细道来。 1.头指针:是指链表指向第一个结点的指针,若链表有头结点(注意也就是说头结点不一定要有),则是指向头结点的指针。 2.头指针的作用:具有标识作用,所以常用头指针冠以链表的名称(指针变量的名字) 3.无论链表是否为空,头指针均不为空 4.头结点是为了操作的统一和方便设立的,放在第一个有数据“真”元素结点之前,其数据域一般无意义(但也可以用来存放链表的长度) 5.有了头结点,对在第一个接结点前插入结点和删除第一个结点操作与其他结点的操作就统一了。 7.对数据元素ai来说,除了存储其本身的信息外,还需要存储一个指示其直接后继的信息(即直接后继的地址) 8.空链表 所以接下来看看单链表的结构体定义吧 define ElemType int typedef struct LNode { ElemType data; struct LNode *next; }LNode;//取别名 typedef struct LNode *LinkList;//取别名 结构体两个别名 其实啊,线性表1看的认真的同学这个结构体,但是跟顺序表不同在于