函数指针

Go 基础语法

只谈情不闲聊 提交于 2020-01-13 03:05:02
转自:http://studygolang.com/topics/548 例子Packages.go: package main import ( "fmt" "math/rand" ) func add(x int, y int) int { return x + y } func main() { fmt.Println("My favorite number is", rand.Intn(10)) fmt.Println(add(42, 13)) } 包:每个 Go 程序都是由包(package)组成的,程序运行的入口是包 main 。 导入:这个代码用圆括号组合了导入,这是“打包”导入语句。同样可以编写多个导入语句,例如: import "fmt" import "math" 这个程序使用并导入了包 "fmt" 和" math/rand" 。包名与导入路径的最后一个目录一致。例如,如果你导入了" math/rand" ,那么你就可以在程序里面直接写rand.Intn(10),但如果你导入的是" math" ,那么你就得写math.rand.Intn(10)。 函数:函数可以没有参数或接受多个参数。在这个例子中, add 接受两个 int 类型的参数,注意类型在变量名之后。有没有觉得很奇怪呢,下面就详细解释一下go这样做的原因。 看一个c的例子: int (*fp)(int

利用函数指针绕过断点

。_饼干妹妹 提交于 2020-01-12 11:47:06
#include<windows.h> int main() { MessageBox(0,0,0,0); //77D5085C int (__stdcall *pFun)(int,int,int,int,int);//定义函数指针类型的变量 pFun = (int (__stdcall *)(int,int,int,int,int))0x77D5085C;//给函数指针赋值 pFun(0,0,0,0,0);//调用函数 return 0; } 还没学到PE,所以先使用硬编码地址,在MessageBox下断点跟进MessageBoxA函数里。 0040D478 8B F4 mov esi,esp 0040D47A 6A 00 push 0 0040D47C 6A 00 push 0 0040D47E 6A 00 push 0 0040D480 6A 00 push 0 0040D482 FF 15 AC A2 42 00 call dword ptr [__imp__MessageBoxA@16 (0042a2ac)] 0040D488 3B F4 cmp esi,esp 0040D48A E8 E1 3B FF FF call __chkesp (00401070) 上面一大段都是检查参数是否合法的,从五个push开始是传参数,到最后一个call是真正调用MessageBox函数

Linux字符串函数集

戏子无情 提交于 2020-01-11 22:31:51
//Linux字符串函数集: 头文件:string.h   函数名: strstr   函数原型: extern char *strstr( char *str1, char *str2);   功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。   返回值:返回该位置的指针,如找不到,返回空指针。 包含文件:string.h   函数名: strstr   函数原型:extern char *strstr(char *str1, char *str2);   功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。   返回值:返回该位置的指针,如找不到,返回空指针。 原型: extern char *strchr( const char *s, char c);    const char *strchr( const char* _Str, int _Val)    char *strchr( char* _Str, int _Ch)   头文件:#include <string.h>   功能:查找字符串s中首次出现字符c的位置   说明:返回首次出现c的位置的指针,如果s中不存在c则返回NULL。   返回值:Returns the address of the first occurrence of

C/C++中的const、static、inline、friend、template、virtual、异常机制等特性

徘徊边缘 提交于 2020-01-11 07:16:46
一、const const关键字的作用 (1)作用: 1)欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了; 2)对指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const; 3)在一个函数声明中,const可以修饰形参表明他是一个输入参数,在函数内部不可以改变其值; 4)对于类的成员函数,有时候必须指定其为const类型,表明其是一个常函数,不能修改类的成员变量; 5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。 const修饰变量 变量的值不能改变 const修饰指针 如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量 如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量 指针常量:不能通过指针来修改变量的值。 常量指针:一直指向该变量,不能给该指针赋予其他地址 函数中使用const const修饰函数参数 表示参数不可变 若参数为引用,可以增加效率 const引用传递和函数按值传递的效果是一样的,但按值传递会先建立一个类对象的副本, 然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效 const按值传递时只是外部对象的拷贝,值的改变不会对外部有什么影响

c语言中的string

百般思念 提交于 2020-01-10 12:28:24
1. strlen(char const* s);   函数传入的是c风格字符串(即以‘\0’结尾的字符数组),返回的长度为size_t(即unsigned int),其长度不包括'\0'。 2. strcpy(char* dest, char const* source);   dest:目标指针;   source:是源指针,传入的必须是c风格字符串或者字符数组。   返回值: dest指针   注意:1. 该函数会将包括'\0'在内的source全部拷贝到dest。如果char* source="abcd"; dest为char[],则dest应该定义为char[5];       2. src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。       3. C语言中不支持用赋值符号“=”直接将一个字符数组赋值给另一个字符数组。因为C语言不支持运算符重载。故而必须用strcpy操作。 3. strncpy(char* dest, char const* source, size_t n);   n代表可以指定字符个数进行赋值。   功能:将字符串source中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。要求:如果n > dest串长度

Windows SDK编程 API入门系列(转)

与世无争的帅哥 提交于 2020-01-10 08:00:28
本文转载自: https://www.cnblogs.com/yjkai/archive/2011/11/11/2245568.html 作者:yjkai 转载请注明该声明。 之一 -那‘烦人’的Windows数据类型 原创文章,转载请注明作者及出处。 首发 http://blog.csdn.net/beyondcode http://www.cnblogs.com/beyond-code/ http://hi.baidu.com/beyondcode Baidu文章地址: http://hi.baidu.com/beyondcode/blog/item/09370f24526d6b6835a80f54.html CSDN文章地址: http://blog.csdn.net/beyondcode/archive/2009/03/23/4015769.aspx Hello Everybody This is beyondcode 大家好 再次自我介绍一下 我是beyondcode, 这次心血来潮, 计划着做一系列关于Windows API 编程的教程,用于帮助一些在Windows API编程上有疑惑的,纳闷的,迷惑的新手朋友们。 先解释一些术语或名词吧 SDK是Software Development Kit的简写,也就是软件开发包的意思,其中就包含了我们写程序要用到的一些头文件,库

基于文件指针的文件操作

核能气质少年 提交于 2020-01-10 00:26:12
基于文件指针的文件操作(缓冲) linux的文件和文件描述符 linux中对目录和设备的操作都是文件操作,文件分为 普通文件,目录文件,链接文件和设备文件 。 普通文件 :也称磁盘文件,并且能够进行随机的数据存储 ( 能够自由 seek 定位到某一个位置 ) ; 管道: 是一个从一端发送数据,另一端接收数据的数据通道; 目录: 也称为目录文件,它包含了保存在目录中文件列表的简单文件。 设备: 该类型的文件提供了大多数物理设备的接口。它又分为两种类型: 字符型设备和块设备。 字符型设备 一次只能读出和写入一个字节的数据,包括调制解调器、终端、打印机、声卡以及鼠标; 块设备 必须以一定大小的块来读出或者写入数据,块设备包括 CD-ROM 、 RAM 驱动器和磁盘驱动器等 ,一般而言,字符设备用于传输数据,块设备用于存储数据。 链接: 类似于 Windows 的快捷方式和 Linux 里的别名,指包含到达另一个 文件路径的文件。 套接字: 在 Linux 中 , 套接字也可以当作文件来进行处理。 基于文件指针的文件操作函数是ANSI 标准函数库 的一部分。 1文件的创建,打开与关闭 原型为: #include <stdio.h> //头文件包含 FILE *fopen(const char *pach,const char *mode); //文件名 模式 int fclose(FILE

EC读书笔记系列之17:条款41、42、43、44、45、46

ぃ、小莉子 提交于 2020-01-09 21:08:56
条款 41 了解隐式接口与编译器多态 记住: ★classes和templates都支持接口和多态 ★对classes而言接口是显式的(explicit),以 函数签名 为中心。多态则是通过virtual函数发生于 运行期 ★对templates而言,接口是隐式的(implicit),奠基于 有效表达式 。多态则是通过 template 具现化 和 函数重载解析 发生于 编译期 条款 42 了解 typename 的双重意义 记住: ★声明template参数时,前缀关键字class和typename可互换( 函数模板或类模板均可 !!!) ★请使用关键字typename标识 嵌套从属类型名称 ;但不得在base class lists或成员初始列内以它作为base class修饰符 --------------------------------------------------------------------- template< class T> class Widget; template< typename T> class Widget; 两者是等效的 ---------------------------- 但有时一定得使用typename: template<typename C> void print2nd( const C& container ) {

寒江独钓(2):串口的过滤

烈酒焚心 提交于 2020-01-09 17:01:31
一、过滤的概念   “过滤”(filter)是极其重要的一个概念。过滤是在不影响上层和下层接口的情况下,在Windows系统内核中加入新的层,从而 不需要修改上层的软件或者下层的真实驱动程序,就加入了新的功能。 二、绑定设备的内核Api之一   通过编程可以生成一个虚拟的设备对象,并“绑定”(Attach)在一个真实的设备上。一旦绑定,则本来操作系统发送给真实设备 的请求,就会首先发送到这个虚拟设备。   在WDK中,有多个内核API能 实现绑定功能 。下面是其中一个函数的原型: NTSTATUSIoAttachDevice(IN PDEVICE_OBJECT SourceDevice,IN PUNICODE_STRING TargetDevice,OUT PDEVICE_OBJECT *AttachedDevice);   IoAttachDevice参数如下:      SourceDevice 是调用者生成的用来过滤的虚拟设备;      TargetDevice 是要被绑定的目标设备。请注意这里的 TargetDevice并不是一个PDEVICE_OBJECT(DEVICE_OBJECT   是设备对象的数据结构,以P开头的是其指针),而是一个字 符串(在驱动开发中字符串用UNICODE_STRING来表示)。实际上,   这个字符串是要被绑定的设备的名字

深度解密Go语言之map

自作多情 提交于 2020-01-08 08:51:52
目录 什么是 map 为什么要用 map map 的底层如何实现 map 内存模型 创建 map 哈希函数 key 定位过程 map 的两种 get 操作 如何进行扩容 map 的遍历 map 的赋值 map 的删除 map 进阶 可以边遍历边删除吗 key 可以是 float 型吗? 总结 参考资料 这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。 我要说明的是,这里对 map 的基本用法涉及比较少,我相信可以通过阅读其他入门书籍了解。本文的内容比较深入,但是由于我画了各种图,我相信很容易看懂。 什么是 map 维基百科里这样定义 map: In computer science, an associative array, map, symbol table, or dictionary is an abstract data type composed of a collection of (key, value) pairs, such that each possible key appears at most once in the collection. 简单说明一下:在计算机科学里,被称为相关数组、map、符号表或者字典,是由一组 <key, value>