函数指针

网络的一些基本函数

你。 提交于 2020-03-06 04:33:59
WSA是windows socket API简称 1 在delphi用这些API时,应先先明 WSAStartup();//初始 WSACleanup;//注销 后面介绍一些简单函数的使用 我也是学了再写,说错的地方指明,这既是自己的笔记 也是大家的参考 2、socket函数 用于生成socket(soket Descriptor) [声明] SOCKET socket(int af,int type,int protocol); [参数] af - 地址家族(通常使用:AF_INET) type - socket的种类 SOCK_STREAM : 用于TCP协议 SOCK_DGRAM : 用于UDP协议 protocol - 所使用的协议 [返回值] 当函数成功调用时返回一个新的SOCKET(Socket Descriptor) 失败时返回INVALID_SOCKET. 3、inet_addr函数 把好象"xxx.xxx.xxx.xxx"的10进制的IP地址转换为32位整数表示方法 [声明] unsigned long inet_addr ( const char FAR *cp ); [参数] cp - 指向用"xxx.xxx.xxx.xxx"的10进制来表示的IP地址字符串的指针 [返回值] 当函数成功调用时返回用32位整数表示的IP地址(按网络字节排列顺序)

函数指针

馋奶兔 提交于 2020-03-03 07:24:43
标题程序运行期间,每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址 (也称“ 入口地址 ” )。 我们可以将函数的入口地址赋给一个指针变量 ,使该指针变量指向该函数。然后通过指针变量就可以调用这个函数。这种指向函数的指针变量称为“函数指针”。 定义形式 类型名 (* 指针变量名)(参数类型1, 参数类型2,…); 例如: int (*pf)(int ,char); 使用方法 用一个原型匹配的函数的名字给一个函数指针赋值。 通过函数指针可以调用它所指向的函数,写法为: 函数指针名(实参表); 举例 1: # include <iostream> # include <cstring> using namespace std ; void PrintMin ( int a , int b ) { if ( a < b ) printf ( "%d" , a ) ; else printf ( "%d" , b ) ; } int main ( ) { void ( * pf ) ( int , int ) ; int x = 4 , y = 5 ; pf = PrintMin ; pf ( x , y ) ; return 0 ; } 举例 2: 类似 qsort库函数: void qsort (void *base, int nelem, unsigned

用函数指针实现跳转表与查询跳转表

人盡茶涼 提交于 2020-03-01 06:11:03
编写程序实现如下功能 1、输出如下内容: 命令 0 增加设备 1 删除设备 2 修改设备 3 查询设备 4 监视设备状态 命令(输入相应数字): 2、分别对应5个功能定义5个实现函数,通过判断输入的数字,执行相应的操作; 3、使用函数指针数组实现。 程序设计思路: 实现函数显示输出菜单文字; 按照要求,需要输入0,1,2,3,4数字来执行相应的命令; 因为需要每个数字对应一个功能,而且是以列表的形态出现,所以考虑使用数组来建立一个表; 根据题目,使用数字作为功能索引,而且从数字0开始,所以可以直接创建函数指针数组,然后根据cmd对应的数字,以这个数字为下标,就能取出对应函数的指针。 原理也就是通过使用数组的下标,来跟对应的函数建立联系。 编码实现: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define DIM(x) (sizeof(x)/sizeof(x[0])) 5 6 void display_menu(void);//显示菜单 7 int get_cmd(void); //从终端获取数字指令的输入 8 void run_cmd(int cmd); //执行命令 9 10 /*每条指令对应的执行函数*/ 11 void cmd_add(void); 12 void cmd_del(void); 13 void cmd

C++程序运行时内存布局之--this到底是什么?

扶醉桌前 提交于 2020-02-29 16:38:31
先问一个问题,在C++里,成员函数里的this指针和调用此函数的对象地址总是一样的吗?如果你的回答是:不一定。那么至少你是个老手吧,下面的内容你就不用看了;如果你的回答是:是啊,那么强烈建议你看看下面的内容。 非静态成员函数,无论是不是虚函数,都隐藏了一个this指针参数。这个参数的目的就是给函数提供一个基地址,以便于函数体内能找到对象的成员变量。那非静态成员函数是如何根据this指针找到成员变量的呢?直接看例子吧 1没有虚表的情况 view plain #include <iostream> #include <stdio.h> using namespace std; class A { public : int x; int y; public : void F1() { this ->x = 1; this ->y = 2; cout<< "this指针得值是:" <<std::hex<<std::showbase<< this <<endl; } }; int main( int argc, char ** argv) { A a; cout<< "a对象的地址是:" <<&a<<endl; cout<< "a对象的大小是:" << sizeof (A)<<endl; cout<< "成员a.x的地址是: " <<&a.x<<endl; cout<< "成员a.x的偏移是

Go基础系列:Go slice详解

半腔热情 提交于 2020-02-29 09:24:22
slice表示切片(分片),例如对一个数组进行切片,取出数组中的一部分值。在现代编程语言中,slice(切片)几乎成为一种必备特性,它可以从一个数组(列表)中取出任意长度的子数组(列表),为操作数据结构带来非常大的便利性,如python、perl等都支持对数组的slice操作,甚至perl还支持对hash数据结构的slice。 但Go中的slice和这些语言的slice不太一样,前面所说的语言中,slice是一种切片的操作,切片后返回一个新的数据对象。而Go中的slice不仅仅是一种切片动作, 还是一种数据结构 (就像数组一样)。 slice的存储结构 Go中的slice依赖于数组,它的底层就是数组,所以数组具有的优点,slice都有。且slice支持可以通过append向slice中追加元素,长度不够时会动态扩展,通过再次slice切片,可以得到得到更小的slice结构,可以迭代、遍历等。 实际上slice是这样的结构:先创建一个有特定长度和数据类型的底层数组,然后从这个底层数组中选取一部分元素,返回这些元素组成的集合(或容器),并将slice指向集合中的第一个元素。换句话说, slice自身维护了一个指针属性,指向它底层数组中的某些元素的集合 。 例如,初始化一个slice数据结构: my_slice := make([]int, 3,5) // 输出slice fmt

一款国产静态程序检查工具与Converity的对比测试

馋奶兔 提交于 2020-02-28 00:42:25
源伞科技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-02-27 14:19:28
函数指针调用方式 void testmy(int k) { cout << "testzhixing " <<k << endl; } int _tmain(int argc, _TCHAR* argv[]) { typedef void(*testmy1)(int);// 定义函数指针相当于一个新的 struct testmy1 p; // 声明指针变量 testmy(1); p = &testmy; p(1); //---调用方式二 testmy(2); //--调用3 void (*ptr)(int); // 声明函数指针 ptr = testmy; ptr(3); } 这种方式一般调用dll用的多 typedef void(*testmy1)(int);// 定义函数指针相当于一个新的 struct testmy1 p; // 声明指针变量 关于这种方式 参考函数指针 为什么要 (*testmy1) 为什么前面加个* 这个确实不是狠明白 但是这种结构的定义反汇编也没有代码,先这样写着把 还有函数testmy的调用是 test() testmy是这个函数的首地址 函数调用汇编相当于call 就是跳到testmy函数地址里面执行 当然首地址肯定是保护堆栈现场的操作 不可能直入正题 来源: https://www.cnblogs.com/xuexidememeda/p

构造函数为什么不能为虚函数 & 基类的析构函数为什么要为虚函数

亡梦爱人 提交于 2020-02-27 03:24:15
一、构造函数为什么不能为虚函数 1. 从存储空间角度,虚函数相应一个指向vtable虚函数表的指针,这大家都知道,但是这个指向vtable的指针事实上是存储在对象的内存空间的。问题出来了,假设构造函数是虚的,就须要通过 vtable来调用,但是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到相应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。虚函数的作用在于通过父类的指针或者引用来调用它的时候可以变成调用子类的那个成员函数。而构造函数是在创建对象时自己主动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。 3. 构造函数不须要是虚函数,也不同意是虚函数,由于创建一个对象时我们总是要明白指定对象的类型,虽然我们可能通过实验室的基类的指针或引用去訪问它但析构却不一定,我们往往通过基类的指针来销毁对象。这时候假设析构函数不是虚函数,就不能正确识别对象类型从而不能正确调用析构函数。 4. 从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数从实际含义上看,在调用构造函数时还不能确定对象的真实类型(由于子类会调父类的构造函数);并且构造函数的作用是提供初始化,在对象生命期仅仅运行一次

C++细节注意点

痴心易碎 提交于 2020-02-25 15:44:44
文章目录 实现和声明的分离 不使用 using namespace std; C++对C语言的增强 重点1 引用 引用的注意事项 引用的本质 指针引用 常量型引用 成员函数调用const修饰对象实例 构造和析构函数实例 拷贝构造函数 拷贝构造函数的调用时机 深拷贝浅拷贝 深拷贝 初始化列表 类对象作为类成员的案例 explicit 关键字 new动态对象创建 完美代替malloc 静态成员变量 静态成员函数 单例模式 成员变量和成员属性分开处理 this指针 this指针的使用 空指针访问成员的函数 常函数和常对象 全局函数做友元函数 整个类做友元类 让成员函数做友元函数 自定义数组实例 运算符重载 二元重载 左移右移的重载的注意点 属性私有后 要使用友元来进行重载 前置后置递增运算符 指针运算符重载(自定义一个智能指针) 赋值运算符重载 [] 运算符的重载 关系运算符重载 函数调用运算符重载 不要重载||和&& 自定义string类 继承 继承方式 继承中的对象模型 继承中的构造和析构顺序 继承中同名成员的处理 继承中静态成员的处理 多继承 菱形继承 解决二义性的方法 虚继承工作原理 多态 静态编联和动态编联 多态原理解析 多态案例1 计算器 抽象类和纯虚基类 虚析构和纯虚析构函数 向上类型转换向下类型转换 游戏多态实例 模板 排序实例 普通函数和函数模板的区别 模板机制内部原理

C++ Primer Plus 笔记第十三章

时光怂恿深爱的人放手 提交于 2020-02-21 05:47:21
类继承 本章内容:    is-a 关系的继承;    如何以公有方式从一个类派生出另一个类;    保护访问;    构造函数成员初始化列表;    向上和向下强制转换;    虚成员函数;    早期(静态)联编与晚期(动态)联编;    抽象基类;    纯虚函数;    何时及如何使用公有继承    面向对象编程的主要目的之一是提供可重用的代码;    C++类提供了更高层次的重用性,类库由类声明和实现构成,因为类组合了数据表示和类方法;    C++提供了比修改代码更好的方法来扩展和修改类——类继承; 13.1 一个简单的基类    从一个类派生出另一个类,原始类成为基类,继承类称为派生类;    程序清单13.1 tabtenn0.h  1 #ifndef TABTENN0_H_ 2 #define TABTENN0_H_ 3 4 class TableTennisPlayer 5 { 6 private: 7 enum {LIM = 20}; 8 char firstname[LIM]; 9 char lastname[LIM]; 10 bool hasTable; 11 public: 12 TableTennisPlayer(const char * fn = "none", const char * ln = "none", bool ht = false);