函数指针

C语言文件操作解析

爷,独闯天下 提交于 2020-01-24 04:12:42
转自:http://www.cnblogs.com/dolphin0520/archive/2011/10/05/2199396.html C语言文件操作解析(一) 在讨论C语言文件操作之前,先了解一下与文件相关的东西。 一.文本文件和二进制文件 文本文件的定义:由若干行字符构成的计算机文件,存在于计算机系统中。文本文件只能存储文件中的有效字符信息,不能存储图像、声音等信息。狭义上的二进制文件则指除开文本文件之外的文件,如图片、DOC文档。 事实上,无论是上面所定义的文本文件还是二进制文件,在计算机中存储都是以二进制的形式存储的,因此其本质并没有区别。所以广义上的二进制文件便指所有的文件。 通常意义下,我们所说的文本文件指只包含了纯文本信息的文件(通过手动编辑完成,包含的都是可显字符),二进制文件特指文件里面存储的是二进制代码的文件。至于为什么在计算机内存储的都是二进制数据,而给我们所呈现的确是文字、图像等信息,这跟计算机硬件组成有关系,因为计算机里面的元件是晶体管,其只有两种稳定的状态,因此二进制的0和1能表示其状态。很多个晶体管的不同状态的组合便呈现给我们不同的信息了。下面以汉字在计算机中的表示为例。 二.汉字在计算机中的表示 用计算机去处理汉字信息,必须对汉字进行编码,变成能被计算机识别的二进制。汉字编码主要有输入码、机内码、字形码三种。分别有不同的作用。 输入码

leetcode | 分类整理

谁说我不能喝 提交于 2020-01-23 16:48:25
双指针: 167. 两数之和(e) 633. 两数平方和(e) 345. 反转字符串中的元音字符(e) 重点:HashSet的应用,在HashSet 中查找的复杂度是O(1) 680 . 回文字符串(e) 重点:因为这道题不是简单判断回文串,由于可以删一个字符(且仅能最多删一个),所以用另一个函数helper,普通的时候就一直l++,r--;第一次遇到不相等,就执行l++或者r--(删除一个字符),而且这个只会执行一次,所以直接另外写一个函数即可 来源: CSDN 作者: Nicole_sss 链接: https://blog.csdn.net/zhicheshu4749/article/details/104075142

C++的那些事:面向对象

人盡茶涼 提交于 2020-01-22 20:56:10
1 OOP概述 面向对象基于三个基本概念:数据抽象、继承和动态绑定。通过使用数据抽象,我们可以将类的接口与实现分离;使用继承,可以定义相似的类型并对其相似关系建模;使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。 1.1 继承 继承是派生类与基类之间的关系,它们共享了一些公共的东西,而派生类特化了一些本质不同的东西。类与类之间的继承关系构成了继承层次。在C++中,基类必须指定希望派生类重定义哪些函数,定义为virtual的函数是基类期待派生类重新定义的,需要在派生类中继承的不能定义为虚函数。 派生类重新定义的虚函数前面可以加virtual,但这不是必要的,在C++11中,允许派生类显式地注明它将使用哪个成员函数改写基类虚函数,只用在该函数形式参数列表后增加一个override关键字。 1.2 动态绑定 当函数接口定义了基类的引用(或指针)时,在函数内调用虚函数时,发生动态绑定。因为这时候函数实参可以为基类类型也可以为派生类类型, 虚函数只有在运行阶段 才能确定需要调用哪个定义。 2 定义基类与派生类 2.1 定义基类 基类成员函数中希望在派生类中重新定义的函数前面加了virtual,这类函数在调用时,在程序运行阶段确定。任何构造函数之外的非静态函数都可以是虚函数。virtual关键字只需要在基类定义的时候加在需要重定义的函数前面,实现的时候不需要。

ARM 汇编基础

你。 提交于 2020-01-19 18:47:10
转载连接: 1 ARM汇编以及汇编语言基础介绍 2 ARM汇编中的数据类型 3 ARM汇编常用指令集 4 ARM汇编内存访问相关指令 5 ARM汇编之连续存取 6 ARM汇编之条件执行与分支 7 ARM汇编之栈与函数 英文原文链接: https://azeria-labs.com/arm-data-types-and-registers-part-2/ 本文只是转载部分内容,具体请参考原文。 1. ARM汇编基础介绍 1.1 ARM VS. INTEL ARM处理器Intel处理器有很多不同,但是最主要的不同怕是指令集了。Intel属于复杂指令集(CISC)处理器,有很多特性丰富的访问内存的复杂指令集。因此它拥有更多指令代码以及取址都是,但是寄存器比ARM的要少。复杂指令集处理器主要被应用在PC机,工作站以及服务器上。 ARM属于简单指令集(RISC)处理器,所以与复杂指令集先比,只有简单的差不多100条指令集,但会有更多的寄存器。与Intel不同,ARM的指令集仅仅操作寄存器或者是用于从内存的加载/储存过程,这也就是说,简单的加载/存储指令即可访问到内存。这意味着在ARM中,要对特定地址中存储的的32位值加一的话,仅仅需要从内存中加载到寄存器,加一,再从寄存器储存到内存即可。 简单的指令集既有好处也有坏处。一个好处就是代码的执行变得更快了。

云计算之go语言——基础语法(中)

雨燕双飞 提交于 2020-01-19 14:18:32
9 Go 语言循环语句 1, 概念 在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。 2, 分类 1. for 循环 : 重复执行语句块 a. 语法: for init; condition; post {} for condition {} for {} init: 一般为赋值表达式,给控制变量赋初值; condition: 关系表达式或逻辑表达式,循环控制条件; post: 一般为赋值表达式,给控制变量增量或减量。 b. 实例 for02.go package main import "fmt" func main() { sum := 0 for i := 0 ; i <= 10; i++ { sum += i } fmt.Println(sum) } for03.go package main import "fmt" func main() { sum :=1 for ; sum <=10 ; { sum +=sum } fmt.Println(sum) for sum <= 10 { sum +=sum } fmt.Println(sum) } c. For-each range 循环 这种格式的循环可以对字符串、数组、切片等进行迭代输出元素。 实例: for04.go package main import "fmt" func

一款国产静态代码分析工具与Converity的对比

妖精的绣舞 提交于 2020-01-17 17:37:27
源伞科技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)问题检测。 准备代码:

函数指针 —— 《C和指针》

断了今生、忘了曾经 提交于 2020-01-17 03:59:39
函数指针 函数指针是指向函数的指针。 因此“函数指针”本身首先是指针变量,只不过该指针变量指向函数。 声明 返回值类型 ( *指针变量名) (形参列表); int (*pfunc)(int x); int (*pfunc)(int); //无需将形参名给出 初始化 和普通指针一样,函数指针在使用之前必须初始化为指向某个函数。 int func(int x); //被指向的函数 pfunc = func; //初始化函数指针pfunc,使其指向函数func pfunc = &func; //也是正确的 int (*pfunc)(int) = func; //也可以直接在声明时进行初始化 注意:在函数指针初始化之前需要有被指向函数func的原型,否则编译器就无法检查func的类型是否和pfunc所指向的类型一致。 使用: int ans; ans = func(5); ans = pfunc(5); ans = (*pfunc)(5); //也是正确的,但间接访问操作是不必要的 注意:在初始化赋值语句中的操作符 & 和调用函数指针时的 * 操作符都是可选的: 1. 函数名被使用时总是由编译器把它转换为函数指针。 & 只是显示地说明了编译器将隐式执行的任务。 2. * pfunc把函数指针pfunc转换为一个函数名,编译器在执行函数调用之前又会把它转换回去。因此这个转换是不必要的。

双向链表C++实现

那年仲夏 提交于 2020-01-16 08:31:55
TableHead类决定使用双向链表,可快速找到其前驱。 实现代码如下 DBLList.h(双向链表类) Code 1 /**/ /*   2 * 湖南大学软件学院07级5班Debugger小组  3 * 4 * 文件名称:DBLList.h 5 * 功能摘要:数据库双向链表 声明文件 6 * 7 * 作者:卓卓 8 * 创建日期:2009年3月14日  9 * 修改日期:2009年3月25日(添加注释并修复letcnt++bug) 10 */ 11 #pragma once 12 13 #include " DBLinkNode.h " 14 #include " DBListADT.h " 15 #include < iostream > 16 using namespace std; 17 18 template < class Type > 19 class DBLList: public DBListADT < Type > 20 { 21 private : 22 DBLinkNode < Type > * head; // 头结点 23 DBLinkNode < Type > * tail; // 尾节点 24 DBLinkNode < Type > * fence; // 当前节点 25 int rightcnt; // 右端长度 26 int leftcnt; /

深入理解JS函数中this指针的指向

爱⌒轻易说出口 提交于 2020-01-14 08:52:40
函数在执行时,会在函数体内部自动生成一个this指针。谁 直接调用 产生这个this指针的函数 ,this就指向谁。 怎么理解指向呢,我认为指向就是等于。例如直接在js中输入下面的等式: console.log(this===window);//true 情况不同,this指向的对象也不同。例如: 1. 函数声明的情况 var bj=10; function add(){ var bj=20; console.log(this);//window console.log(this.bj);//10 console.log(bj);//20 console.log(this.bj+bj);//30 } add(); window.add(); (1) 执行了add()之后,此时的this指向的是window对象,为什么呢?因为这时候add是全局函数,是通过window 直接调用 的。所以下面我专门写了个window.add()就是为了说明,全局函数的this都是指向的window。 (2) 就像alert()自带的警告弹窗一样,window.alert()执行之后也是一样的效果。所以只要是 window点 这种调用方式都可以省略掉,因此警告弹窗可以直接使用alert()。 2. 函数表达式 var bj=10; var zjj=function(){ var bj=30;

替罪羊树(重量平衡树)入门

泪湿孤枕 提交于 2020-01-13 07:30:20
扯 学校清明竟然给放两天假期,心血来潮突然想去学习平衡树。 可是我太弱了学不会有旋转操作的treap和splay,这可怎么办啊qaq。 诶?我以前好像看过一种叫做替罪羊树的平衡树可以不用旋转操作,那还是学这个吧…… 替罪羊树 用处 替罪羊树是一种平衡树,支持插入,删除,查找第k小元素,查找元素的排名等操作 什么数据结构优雅? 暴力即是优雅! 替罪羊树就是一种暴力平衡树,旋转?不存在的! 替罪羊树保持平衡的方法就是暴力重构,即当树不平衡时拍扁重新建树,那么如何才能知道一棵树是否平衡呢? 在替罪羊树中选用了一种叫做平衡因子的东西,听起来很高端,其实就是一个0.5~1之间的任意浮点数,保持平衡的方法是这样的: 如果一棵树的左子树/右子树的 存在的 节点数量大于这棵树的 存在的 节点数量*旋转因子,那么就要重构这棵树 为什么我特意标出了是存在的节点数呢?是因为替罪羊树的删除不是真正的删除,而是惰性删除。 所以我们就可以写出代表替罪羊树的每个节点的结构体 1 const double alpha = 0.75; //旋转因子 2 struct Node { 3 Node* ch[2]; //左右子节点 4 int key,siz,cover; //key是值,siz是以该节点为根的树的存在的节点数,cover是所有节点数量 5 bool exist; //exist标志该节点是否被删除 6