指针

WinCE平台下BMP转JPG代码备份3

安稳与你 提交于 2020-02-17 14:30:15
1 //带参数的保存位图函数 2 BOOL FileOperate::bmpSaveImage(PTSTR pstrFileName, BITMAPFILEHEADER *pbmfh) 3 { 4 BOOL bSuccess ; 5 DWORD dwBytesWritten ; 6 HANDLE hFile; 7 8 hFile = CreateFile ( pstrFileName, GENERIC_WRITE, 0, NULL, 9 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ; 10 11 if (hFile == INVALID_HANDLE_VALUE) { 12 return FALSE ; 13 } 14 15 bSuccess = WriteFile (hFile, pbmfh, pbmfh->bfSize, &dwBytesWritten, NULL); 16 17 CloseHandle (hFile) ; 18 19 if (!bSuccess || (dwBytesWritten != pbmfh->bfSize)) { 20 DeleteFile (pstrFileName) ; 21 return FALSE ; 22 } 23 return TRUE ; 24 } 25 26 //**************

滑动窗口算法技巧

冷暖自知 提交于 2020-02-17 10:28:26
本文详解「滑动窗口」这种高级双指针技巧的算法框架,带你秒杀几道高难度的子字符串匹配问题。 LeetCode 上至少有 9 道题目可以用此方法高效解决。但是有几道是 VIP 题目,有几道题目虽不难但太复杂,所以本文只选择点赞最高,较为经典的,最能够讲明白的三道题来讲解。第一题为了让读者掌握算法模板,篇幅相对长,后两题就基本秒杀了。 本文代码为 C++ 实现,不会用到什么编程方面的奇技淫巧,但是还是简单介绍一下一些用到的数据结构,以免有的读者因为语言的细节问题阻碍对算法思想的理解: unordered_map 就是哈希表(字典),它的一个方法 count(key) 相当于 containsKey(key) 可以判断键 key 是否存在。 可以使用方括号访问键对应的值 map[key]。需要注意的是,如果该 key 不存在,C++ 会自动创建这个 key,并把 map[key] 赋值为 0。 所以代码中多次出现的 map[key]++ 相当于 Java 的 map.put(key, map.getOrDefault(key, 0) + 1) 。 本文大部分代码都是图片形式,可以点开放大,更重要的是可以左右滑动方便对比代码。下面进入正题。 一、最小覆盖子串 题目不难理解,就是说要在 S(source) 中找到包含 T(target) 中全部字母的一个子串,顺序无所谓

C++11 智能指针

安稳与你 提交于 2020-02-17 09:07:08
本文内容源自 C++11 智能指针 原作者:Babu_Abdulsalam 本文翻译自 CodeProject ,转载请注明出处。 引入 Ooops. 尽管有另外一篇文章说 C++11 里的智能指针了。近来,我听到许多人谈论 C++ 新标准,就是所谓的 C++0x/C++11。 我研究了一下 C++11 的一些语言特性,发现确实它确实有一些巨大的改变。我将重点关注 C++11 的智能指针部分。 背景 普通指针(normal/raw/naked pointers)有哪些问题? 让我们一个接一个的讨论。 如果不恰当处理指针就会带来许多问题,所以人们总是避免使用它。这也是许多新手程序员不喜欢指针的原因。指针总是会扯上很多问题,例如 指针所指向对象的生命周期 , 挂起引用 (dangling references)以及 内存泄露 。 如果一块内存被多个指针引用,但其中的一个指针释放且其余的指针并不知道,这样的情况下,就发生了挂起引用。 而内存泄露,就如你知道的一样, 当从堆中申请了内存后不释放回去,这时就会发生内存泄露 。有人说,我写了清晰并且带有错误验证的代码,为什么我还要使用智能指针呢?一个程序员也问我:“嗨,下面是我的代码,我从堆(heap)中申请了一块内存,使用完后,我又正确的把它归还给了堆,那么使用智能指针的必要在哪里?” void Foo ( ) { int * iPtr =

php文件权限

与世无争的帅哥 提交于 2020-02-17 02:43:14
"r" 只读方式打开,将文件指针指向文件头。 "r+" 读写方式打开,将文件指针指向文件头。 "w" 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 "w+" 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 "a" 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 "a+" 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 "x" 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。 这和给底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。 此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。 "x+" 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。 这和给底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。 此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。 来源: https://www.cnblogs

【笔记】模板类成员函数指针的使用

放肆的年华 提交于 2020-02-17 02:16:29
# include <stdio.h> # include <stdlib.h> # include <map> # define TRUE 1 # define FALSE 0 /// 单向链表队列模板类 template < typename T > class TMyQueue { public : TMyQueue ( ) { head_ = NULL ; tail_ = NULL ; max_size_ = 10 ; size_ = 0 ; } TMyQueue ( int max_size ) { head_ = NULL ; tail_ = NULL ; max_size_ = max_size ; size_ = 0 ; } ~ TMyQueue ( ) { while ( head_ != NULL ) { Node * tmp = head_ ; head_ = head_ - > next ; free ( tmp ) ; } tail_ = NULL ; printf ( "[~TMyQueue]head_ = %p, tail_ = %p\n" , head_ , tail_ ) ; } bool IsFull ( ) { return ( size_ == max_size_ ) ; } bool IsEmpty ( ) { return ( size_

C++(七)指针

蓝咒 提交于 2020-02-16 23:16:58
文章目录 一、地址与指针 定义指针及初始化 二级指针 二、指针与数组 字符指针与字符数组 三、指针与动态数组 new 分配内存 delete 释放内存 一、地址与指针 日常生活中我们会问一个人住在哪,比如小明家住在XX省XX市XX县XX镇XX村,这就是其详细住址,也就是地址。 那么在程序中定义的任何变量实际上都是存在内存中的,那么他们的具体位置是多少呢,这里就涉及到了地址。就是这个变量真正存在的位置。 下面我们用代码举个例子,例如定义一个字符: char ch = ‘a’; 我们用vs的监视窗口来看下字符 ch 的地址是多少呢? 那么在使用 cout << ch; 进行输出的时候,cout 也会去从 ch 的地址开始读取一个字符,之后打印输出出来。 变量的地址一般都是比较难记的,例如:0x007f2eab 之类的,那么能不能用专门的一个东西,或者说一种特殊类型的变量来保存这个地址呢?这个特殊类型的变量就是指针。 定义指针及初始化 int* p; //声明了一个指向int类型的指针,就在类型的后面加上一个*,代表是指针类型变量的意思。 但是他没有指向任何变量的地址。 # include "stdafx.h" # include <iostream> using namespace std ; int main ( ) { //定义的时候初始化 int a = 5 ; int *

函数调用约定

ε祈祈猫儿з 提交于 2020-02-16 22:17:48
在C语言中,假设我们有这样的一个函数: int function(int a,int b) 调用时只要用result = function(1,2)这样的方式就可以使用这个函数。但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者和函数本身来协调。为此,计算机提供了一种被称为栈的数据结构来支持参数传递。 栈是一种先进后出的数据结构,栈有一个存储区、一个栈顶指针。栈顶指针指向堆栈中第一个可用的数据项(被称为栈顶)。用户可以在栈顶上方向栈中加入数据,这个操作被称为压栈(Push),压栈以后,栈顶自动变成新加入数据项的位置,栈顶指针也随之修改。用户也可以从堆栈中取走栈顶,称为弹出栈(pop),弹出栈后,栈顶下的一个元素变成栈顶,栈顶指针随之修改。 函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈恢复原装。 在参数传递中,有两个很重要的问题必须得到明确说明: 当参数个数多于一个时,按照什么顺序把参数压入堆栈 函数调用后,由谁来把堆栈恢复原装 在高级语言中,通过函数调用约定来说明这两个问题

数据结构相关基础(软考必知)

馋奶兔 提交于 2020-02-16 21:28:04
基本结构:顺序,选择,循环 算法复杂度 - 特定输入法有关 链表存储,插入,删除效率最高 前序:中左右;中序:左中右;后序:左右中 顺序结构一定是连续的,链式结构不一定连续。 对象:标识唯一,分类,多态,封装,模块独立,标识唯一 一个字节二进制位数为8 ASDL非对称数字用户环路,ISP互联网服务提供商,TCP传输控制协定。 栈支持子程序调用。 数据库应用系统核心问题:数据库设计。 编译:高级语言到低级语言等价编译。 算法有穷性:运算时间有限 E-R图转换为关系表:逻辑设计阶段 代码编写阶段可进行:单元测试。 数据库管理系统:系统软件。 字节越长,计算机处理速度越快。 系统总线:数据,地址,控制。 需求分析:解决软件做什么。 cpu主频,内核工作的时钟频率 计算机执行速度:MIPS 编译程序:高级,可执行 避免:goto语言泛滥。 软件测试:单元,集成,确认,系统。 需求阶段:编写规格说明书,获取需求分析。 计算机指令:算数运算,逻辑运算。 冯若依曼:二进制,存储程序 对象主要特征:抽象,继承,封装,多态 结构化方法需求工具: 数据流图,数据字典。判断树,判定表; 2n节点完全二叉树,叶子节点为n; 黑盒测试依据(程序外部功能)设计测试用例根据(软件要完成的功能); 每经过一次元素交换会产生新的逆序:快速排序。 与总线位数相同的部件,CPU 数据库系统分为:层次,网状,关系。

5.最长的回文子串

懵懂的女人 提交于 2020-02-16 19:12:02
暴力解法 思路 1、做一个子函数,用于检测输入的字符串是否是回文串 2、使用双指针,头指针从字符串开始处遍历,尾指针每次均从结尾处开始,检查头尾指针之间的字符串是否是回文串,若是,且长度大于之前的长度,则更新,否则进行下次检查,注意,大循环的结束条件可以随着找到回文子串的长度而更新。 代码 # include <stdio.h> # include <string.h> # include <stdlib.h> // for malloc(), free() # define YES 1 # define NO 0 int IsPalindrome ( char * strIn , int strLength ) { for ( int i = 0 ; i < strLength / 2 ; i ++ ) { if ( strIn [ i ] != strIn [ strLength - 1 - i ] ) { return NO ; } } return YES ; } char * longestPalindrome ( char * s ) { int strLength = strlen ( s ) ; if ( strLength < 2 ) { return s ; } char tmpLongestPald [ 1001 ] = { 0 } ;

查找链表中间节点 -- C语言

喜夏-厌秋 提交于 2020-02-16 19:06:50
算法思路 1. 求链表总长度,取得一半数,遍历链表一半的数量,取得中间节点 2. 用两个指针,一个每次都移动一回,一个每两次移动一回,当第一个指针遍历完链表,后一个指针就正好指向中间 代码实现1 st_dataNode * getListMidNode(st_dataNode * head){ if(NULL == head){ printf("%s: param error\n",__func__); return NULL; } int len = 0; int m = 0; st_dataNode * mid = NULL; len = getListLen(head); m = (len / 2 - 1); // 注意应该建议,因为下标是从0开始的 if(m == 0){ return head; } mid = head; while(m > 0){ mid = mid->next; m--; } return mid; } 代码实现2 /* 通过一次遍历来完成寻找中间节点 */ st_dataNode * getListMidNode2(st_dataNode * head){ if(NULL == head){ printf("%s: param error\n",__func__); return NULL; } int step1 = 0, step2 = 0;