指针

链表浅谈

一个人想着一个人 提交于 2019-12-26 00:33:51
基础数据结构--链表 导语 常见链表结构 链表常见操作 导语 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的实现顺序是通过链表中的指针链接次序实现的。链表由一系列的节点(链表中每个元素成为节点)组成,节点可以在运行时动态生成。每个节点包括两部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址大的指针域。 常见链表结构 链表结构五花八门,常见的链表结构有:单链表、双向链表和循环链表。 单链表 单链表中两个结点比较特殊,分别是第一个结点和最后一个结点,我们习惯称第一个结点叫头结点把最后一个结点称尾结点,其中头结点用来记录链表的基地址,尾结点比较特殊指针不是指向下一个结点合适一个空地址NULL 循环链表 循环链表是一种特殊的单链表,尾结点指针指向头结点地址 双向链表 顾名思义双向链表支持两个方向,每个节点不止有一个后继指针next指向后边的结点,还有一个前驱指针prev指向前面的结点 双向链表的优点 在实际开发中,从链表中删除一个数据有两种情况: 1:删除结点中“值等于某个给定值”的结点 2:删除给定指针指向的结点 对于第一种情况不管是单链表还是双向链表,为了查找到值等于给定值的结点,都需要从头结点开始一个一个遍历对比,直到找到值等于给定值得结点。然后在通过指针操作将其删除。时间复杂度分析,时间消耗在遍历数值上面复杂度为O(n); 第二种情况

指针的本质:表示内存地址的数据类型

假装没事ソ 提交于 2019-12-25 21:32:13
更多来自: http://imcc.blogbus.com 3.9.1 指针的本质:表示内存地址的数据类型 在典型的32位平台上,可以把内存空间看成是由很多个连续的小房间构成的,每个房间就是一个小存储单元,大小是1个字节,房间中住着数据。有的数据比较小,比如一个char类型的字符,它只需要一个房间就够了。而有的数据比较大,就需要占用好几个房间,比如一个int类型的整数,其大小是4个字节,需要4个房间才可以安置。为了方便找到住在这些房间中的数据,房间就需要按照一定的规则编号,这个编号,就是通常所说的内存地址。这些编号是用一个32位的二进制数来编码的,比如0x7AE4074B、0xFFFFFFFF等,如图3-6所示。一旦知道某个数据的房间编号,就可以通过这个编号来对相应房间中的数据进行存取操作。C++中为了灵活地操作内存,特别内建了一种特殊的数据类型,以用来存放内存单元的地址,这就是指针。而存放在指针中的内存地址,则可能是一个对象的地址、一个整数的地址,甚至是一个函数的地址。一般来说,如果指针变量所保存的是一个对象或者函数的地址,就说这个指针指向这个对象或者函数。 图3-6 内存被划分为许多小的单元房间 来源: https://www.cnblogs.com/chenliangqiao/archive/2011/07/15/2107100.html

void,extern,sizeof

左心房为你撑大大i 提交于 2019-12-25 18:33:37
高手潜规则:禁用 goto 程序质量与 goto 出现次数成反比 void 指针的意义 1.C 语言规定只有相同类型的指针才可以相互赋值 2.void* 指针作为坐值用于“接收”任意类型的指针 3.void* 指针作为右值赋给其它指针时需要强制转换类型。 int *pI = (int*)malloc(sizeof(int)); extern 的意义 1. 用于声明外部定义的变量和函数 2. 用于 “告诉”编译器用 C 方式编译 C++ 编译器和一些变种 C 编译器默认会按自己的方式编译函数和变量,所以有事需要 extern 关键字。 extrn “C” { int f(int a,int b) { return a+b; } } sizeof 是编译器内置指示符,不是函数。 用法: 用了统一, sizeof(int) ,不推荐用空格。 来源: https://www.cnblogs.com/stm32f4/p/6264765.html

指针二三事

痴心易碎 提交于 2019-12-25 13:43:21
C 语言中最棘手问题的当属指针了,不过这也是 C 的精华所在。 指针也是一种变量,区别在于他的值是一个内存地址。 32 位机器上,指针变量占用四个字节。往往你觉得你把指针弄的很透彻了,但你还是会做错题目,或许因为粗心,或许自己混淆了,总之指针问题真的很绕。最近笔者在看「程序员求职成功之路」,书中伊始讲的就是 C 语言指针,看完之后获益匪浅,特在此总结一下。 1. 先看一道经典的指针题目: #include <stdio.h> int main() { int a[5][10]; printf("%d,%d,%d\n",a,a+1,&a+1); return 0; }    输出结果为如下,试分析其原因 原因分析: a 和 &a 都是数组 a[5][10] 的首地址。但是他们的类型却不相同, a 是 int a [10] 的类型,而 &a 是 a [5][10] 的类型。指针运算中加减 1 代表的加减了指针类型的长度。故: a+1=2293360+4*10=2293400 &a +1= 2293360 +4*10*5=2293560 更抽象的说,例如数组 int a [M1][M2][.....][M n ] a+1= 首地址 +M2*M3* ......*Mn*sizeof(int) &a+1= 首地址 +M1*M2* M3*......* Mn *sizeof(int) 2.

指针二三事

瘦欲@ 提交于 2019-12-25 13:43:07
C 语言中最棘手问题的当属指针了,不过这也是 C 的精华所在。 指针是一种 数据类型 ,区别在于指针类型的值是一个内存地址。 32 位机器上,指针变量占用四个字节。往往你觉得你把指针弄的很透彻了,但你还是会做错题目,或许因为粗心,或许自己混淆了,总之指针问题真的很绕。最近笔者在看「程序员求职成功之路」,书中伊始讲的就是 C 语言指针,看完之后获益匪浅,特在此总结一下。 1. 先看一道经典的指针题目: #include <stdio.h> int main() { int a[5][10]; printf("%u,%u,%u\n",a,a+1,&a+1); return 0; }    输出结果为如下,试分析其原因 原因分析: a 和 &a 都是数组 a[5][10] 的首地址。但是他们的类型却不相同, a 是 int a [10] 的类型,而 &a 是 a [5][10] 的类型。指针运算中加减 1 代表的加减了指针类型的长度。故: a+1=2293360+4*10=2293400 &a +1= 2293360 +4*10*5=2293560 更抽象的说,例如数组 int a [M1][M2][.....][M n ] a+1= 首地址 +M2*M3* ......*Mn*sizeof(int) &a+1= 首地址 +M1*M2* M3*......* Mn *sizeof(int

C++类成员指针

狂风中的少年 提交于 2019-12-25 13:25:09
类成员指针 类成员指针是指可以指向类的非静态成员的指针。成员指针指向的是类的成员。类的静态成员不属于任何对象,因此无须特殊的静态成员的指针,指向静态成员的指针和普通函数指针没有什么区别。当初始化一个类成员指针时,令其指向类的某个成员,但是不指定该成员所属的对象,直到使用成员指针时,才提供成员所属的对象。 数据成员指针 类成员指针的使用*表示当前声明的名字是一个指针,但是在*之前必须添加className::表示当前定义的指针可以指向className的成员。例如: const std::string Screen::*pData;//pdata可以指向一个常量(非常量)Screen对象的std::string成员 上述语句将pData声明成“一个指向Screen类的const std::string 成员的指针”。const对象的数据成员本身也是const的,pData声明为const std::string意味着可以指向任何Screen对象的一个成员,不管该Screen对象是否是cosnt的。但是使用pData只能读取它所指的成员,而不能向它写入数据。 初始化类成员指针: pData = &Screen::contents;//取地址符&作用于Screen类的成员而非内存中的一个该类的对象。 用C++11语法声明类成员指针最简单的方法是使用auto或decltype: auto

数组指针

社会主义新天地 提交于 2019-12-25 03:06:40
int a; int *a=&a; int **ppa=&pa; 类型 数组名[常量] int *a[10] intx[10]指针指向数组 前提 int a[10]; int *pa=a;// int pa=&a[0]; pa+i< >a+i< >&a[i]< >&pa[i] *(pa+i)< > (a+i)< >a[i]< >pa[i] p++; p; p++使p指向下一个元素a[1],然后再执行 p,得到的是下一个元素a[1]的值。 p++ 由于++和 同级运算,他等于*(p++)先引用p的值,实现*p的运算,然后再使p自增1. 来源: CSDN 作者: 键鼠 链接: https://blog.csdn.net/ilanyangyang/article/details/103687724

关于Flutter的点击事件

↘锁芯ラ 提交于 2019-12-25 03:04:46
常用的点击事件有InkWell(内置水波纹效果)和GestureDetector(手势操作),其他无点击事件操作的控件就需要用以上去包裹进行操作,不过还是多根据实际需要去选择使用什么控件吧,下面简略的摘录一下他人对GestureDetector的一些属性详解。 原文链接 一,概述   移动应用中一个必不可少的环节就是与用户的交互,在Flutter中提供的手势检测为GestureDetector。 Flutter中的手势系统分为二层: 第一层是触摸原事件(指针) PointerDownEvent:用户与屏幕接触产生了联系 PointerMoveEvent:手指已从屏幕上的一个位置移动到另一个位置 PointMoveEvent:指针停止接触屏幕 PointerUpEvent:用户已停止接触屏幕 PointerCanceEvent:此指针的输入不再指向此应用程序 第二层是手势事件(轻击,拖动,缩放) 自带交互的控件监听 RaisedButton、 IconButton、 OutlineButton、 Checkbox、 SnackBar、 Switch等     不自带交互的控件监听 用GestureDelector进行手势检测 用Dismissible实现滑动删除     二,手势事件 1.自带交互的控件 在Flutter中,自带如点击事件的控件有RaisedButton

python中的文件详解

痴心易碎 提交于 2019-12-25 02:27:44
文章目录 文件的操作 对非纯文本文件的操作 对文件的特殊读取方式 文件移动指针 例题 上下文管理器 文件的操作 2.操作 对非纯文本文件的操作 对文件的特殊读取方式 文件移动指针 例题 读取文件内容 并返回一个列表 列表元素分别为文件的行内容,去除每个元素后面的\n 方法一: 2.方法二: 上下文管理器 注意: 当读完一个文件后,如果不移动它的文件指针,则再次读时,就读不到文件内容了,因为读完一次后文件指针移动到文件末尾了。 来源: CSDN 作者: 难得 yx 链接: https://blog.csdn.net/weixin_45649763/article/details/103656442

继承和虚函数

耗尽温柔 提交于 2019-12-25 01:30:04
虚函数 特征 1.构造和析构中会填写虚表指针 先调用父类构造,先填写父类虚表指针,再执行父类构造函数体 后调用子类构造,填写子类虚表指针,执行子类构造函数体 析构与上述相反(先子类,再父类) 2.虚表特征 虚表存放在只读数据区 虚表中每个成员都是成员函数指针 3.以填写虚表为界限 填写虚表上面是初始化列表 填写虚表下面是构造/析构函数体 4.当有虚表的时候,默认就会提供构造 其他补充 1.如何快速判断一个带有虚函数的类的继承层次? 在虚表指针的地方下硬件写入断点 断点来N次,说明有N-1个父类,减一因为自己也会填一次虚表指针 2.构造析构里调用虚函数会如何? 多态会失效 原因:防止父类调用到子类虚函数,子类在未构造的情形下,会调用到未初始化的资源 编译器优化两种方案: 构造或析构里调用虚函数为直接调用call address(直接绑定地址) 构造或析构里调用虚函数,但仍为本类的虚函数(因为虚表指针此时指向的虚表是自己的) 来源: CSDN 作者: code_greenhand 链接: https://blog.csdn.net/qq_35426012/article/details/103690290