指针

struct,interface,method

断了今生、忘了曾经 提交于 2020-02-16 01:25:43
struct类型,值传递的 声明 struct { name string age int } //几种声明使用方式: var P person // P现在就是person类型的变量了 P.name = "Astaxie" // 赋值"Astaxie"给P的name属性. P.age = 25 // 赋值"25"给变量P的age属性 //按照顺序提供初始化值 P := person{"Tom", 25} //通过field:value的方式初始化,这样可以任意顺序 P := person{age:24, name:"Tom"} //当然也可以通过new函数分配一个指针,此处P的类型为*person P := new(person) struct的匿名字段 struct定义的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段。当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct。 所有的内置类型和自定义类型都是可以作为匿名字段的 type Human struct { age int phone string // Human类型拥有的字段 } type Student struct { Human // 匿名字段,struct int // 内置类型作为匿名字段

C++ 进阶 ----智能指针

瘦欲@ 提交于 2020-02-16 01:05:02
1基本概念 1.1指针的危害: 指针未初始化 野指针: 内存泄漏(申请动态内存 未释放) 1.2分类 1.3本质 将指针封装为 类对象成员 ,并在 析构函数 里删除指针指向的内存。 1.4不同 名称 不同 auto_ptr 马上删除。 unique_ptr 马上删除。 scoped_ptr 马上删除。 shared_ptr 计数为0删除。 weak_pt 不删除 2auto_ptr 2.1作用 对作用域内的动态分配对象的 自动释放 2.2基本类型 int * p = new int ( 10 ) ; cout << * p << endl ; //这样会导致内存泻露 通过valgrind ./a.out 就可以看出申请一个 释放0个 泄露4个字节 //智能指针 miniSTL :: auto_ptr < int > ap ( p ) ; cout << * ap << endl ; //ap等同与p 通过valgrind ./a.out 就可以看出申请一个 释放1个 无泄露 2.3类类型 Test * t = new Test ; t - > Func ( ) ; //通过valgrind ./a.out 就可以看出申请一个 释放0个 泄露1个字节 miniSTL :: auto_ptr < Test > apt ( t ) ; t - > Func ( ) ; /

09-函数重载分析(下)

蹲街弑〆低调 提交于 2020-02-15 23:53:13
注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。 测试环境:Ubuntu 10.10 GCC版本:4.4.5 一、重载与指针 1)下面的函数指针将保存在哪个函数的地址? 2) 函数重载 遇上 函数指针 - 将 重载函数名 赋值给 函数指针 时 1.根据重载规则挑选与 函数指针参数列表一致 的候选者 2. 严格匹配 候选者的函数类型与函数指针的 函数类型 编程实验 函数重载VS函数指针 9-1.cpp /* 这个例子是为了证明: - 重载函数名赋值给指针时 1.根据重载规则挑选与函数指针参数列表一致的候选者 2.严格匹配候选者的函数类型与函数指针的函数类型 */ #include <stdio.h> #include <string.h> int func(int x) { return x; } int func(int a, int b) //不满足条件1 { return a + b; } int func(const char* s) //不满足条件2 { return strlen(s); } typedef int(*PFUNC)(int a); //typedef void(*PFUNC)(int a); //函数类型与定义的函数不相同 int main(int argc, char *argv[]) { int c = 0; PFUNC p = func

数组指针和指针数组的区别

半世苍凉 提交于 2020-02-15 23:00:25
数组指针和指针数组的区别 指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针 数组指针:a pointer to an array,即指向数组的指针 int* a[4] 指针数组 表示:数组a中的元素都为int型指针 元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于* int (*a)[4] 数组指针 表示:指向数组a的指针 元素表示:(*a)[i] 注意:在实际应用中,对于指针数组,我们经常这样使用: typedef int* pInt; pInt a[4]; 这跟上面指针数组定义所表达的意思是一样的,只不过采取了类型变换。 代码演示如下: #include <iostream> using namespace std; int main() { int c[4]={1,2,3,4}; int *a[4]; //指针数组 int (*b)[4]; //数组指针 b=&c; //将数组c中元素赋给数组a for(int i=0;i<4;i++) { a[i]=&c[i]; } //输出看下结果 cout<<*a[1]<<endl; //输出2就对 cout<<(*b)[2]<<endl; //输出3就对 return 0; } 注意:定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址,容易犯的错得就是

指针

折月煮酒 提交于 2020-02-15 22:58:28
数组指针和指针数组 每次看到代码中的数组指针或者指针数组都要纠结半天,所以下定决心区分这两个类型。 数组指针 形容词在前,名词在后所以这是一个指向数组的指针。 int (*p)[n]; //优先级()>[]>* 小括号优先级最高,所以这是一个指针,中括号其次所以这是一个数组指针。 指针数组 形容词在前,名词在后所以这是一个值全是指针类型的数组。 定义 int *p[n]; //优先级()>[]>* 中括号优先级大于 ,所以这是一个数组,数组中元素类型是 即指针类型。 指针函数和函数指针 指针函数 指针函数:形容词在前,名词在后所以这是一个返回指针类型的函数 定义:类型标识符 *函数名(参数表) int *f(x,y); //优先级()>[]>* 小括号优先级最高,需要参数,所以这是一个函数,*其次所以这是一个返回指针类型的函数。 函数指针 函数指针:形容词在前,名词在后所以这是一个指向函数的指针类型 定义:类型标识符 (*函数指针变量名)(参数) int (*f) (int x); /*声明一个函数指针 */ 小括号优先级最高,其次是 ,所以先是 f,本质是个指针,所以这是一个指向函数的指针。 来源: https://www.cnblogs.com/wangjian1226/p/11048251.html

C ~ 指针零散记录

南楼画角 提交于 2020-02-15 22:58:06
2016.10.11 一个记录 void MB_float_u16(float f,uint16_t *a,uint16_t *b) { uint8_t *fp; ① uint8_t *ap; ② ap=(uint8_t*)a ③ fp=(uint8_t*)&f; ④ ap[1]=fp[3]; ⑤ ap[0]=fp[2]; ⑥ ap=(uint8_t*)b; ⑦ ap[1]=fp[1]; ⑧ ap[0]=fp[0]; ⑨ } uint8_t *fp = uint8_t fp[] 两者等价 数组没有声明元素个数 则根据数组的使用自动匹配元素个数 32位系统中指针变量都占4个字节 只有在提取数据的时候才按照类型来分配。 fp=(uint8_t*)&f; 这里只是指向相同的地址 和数据 1、2:创建两个指针变量 fp ap 3: ap指向a 因为ap是uint8_t 类型的 所以强制转换 才能赋值 4:相同道理 5:实参 a地址的内容 a[1]等于浮点数 f (占四字节)最后一个字节的内容 6:实参 a地址的内容 a[0]等于浮点数 f 第三个字节的内容 7:将ap指向实参b 8:实参b地址的内容 b[1]等于浮点数 f 第二个字节的内容 9:实参b地址的内容 b[0]等于浮点数 f 第一个字节的内容 2016.10.11 关于结构的一个记录 typedef struct 定义的结构体

线程池理解

久未见 提交于 2020-02-15 19:43:32
Linux 多线程编程之 线程池 的原理和一个简单的C实现,提高对多线程编 程的认知,同步处理等操作,以及如何在实际项目中高效的利用多线程开 发。 1. 线程池介绍 为什么需要线程池??? 目前的大多数网络服务器,包括Web服务器、Email服务器以及数据库服务 器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求, 但处理时间却相对较短。 传统多线程方案中我们采用的服务器模型则是一旦接受到请求之后,即创 建一个新的线程,由该线程执行任务。任务执行完毕后,线程退出,这就 是是“即时创建,即时销毁”的策略。尽管与创建进程相比,创建线程的时 间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执 行次数极其频繁,那么服务器将处于不停的创建线程,销毁线程的状态, 这笔开销将是不可忽略的。 线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对 多个任务重用线程,线程创建的开销被分摊到了多个任务上。其好处是, 因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的 延迟。这样,就可以立即为请求服务,使应用程序响应更快。而且,通过 适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时, 就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从 而可以防止资源不足。 2. 线程池结构 2.1 线程池任务结点结构

智能指针(HasPtr)实现 .

旧巷老猫 提交于 2020-02-15 17:38:15
智能指针显然是C++吸引人的地方之一,必须掌握。看了《C++primer》,里面着重讲了智能指针的实现方式。 书中说到: “HasPtr(注:就是自定义的智能指针)在其它方面的行为与普通指针一致。具体而言,复制对象时,副本和原对象将指向同一基础对象。如果通过一个副本改变基础对象,则通过另一个对象访问的值也会改变。 新的HasPtr类需要一个析构函数来删除指针。但是,析构函数不能无条件的删除指针。” 条件就是引用计数。 如果该对象被两个指针所指,那么删除其中一个指针,并不会调用该指针的析构函数,因为此时还有另外一个指针指向该对象。看来,智能指针主要是预防不当的析构行为,防止出现悬垂指针。 如上图所示,HasPtr就是智能指针,U_Ptr为计数器,定义如下: [cpp] view plain copy print ? class U_Ptr { friend class HasPtr; int *ip; size_t use; U_Ptr( int *p) : ip(p), use(1) { cout << "U_ptr constructor called !" << endl; } ~U_Ptr() { delete ip; cout << "U_ptr distructor called !" << endl; } }; class U_Ptr { friend class

[c++primer][04]数组和指针

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-15 10:36:16
现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针。设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。 4.1 数组 数组的维数必须用值大于等于1的常量表达式定义。非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。 初始化 如果没有显式提供元素初值,数组元素与变量初始化规则一致。 字符串字面值包含一个额外额空字符(null)用于结束字符串 const char ch[6] = “Daniel” ; //error: Daniel is 7 elements  操作 数组下标的正确类型是size_t 4.2 指针的引入 什么是指针 指针保存的是另一个对象的地址,&操作符只能用于左值 初始化 避免使用未初始化的指针 有效的指针或者保存一个特定对象的地址,或者指向某个对象后面的另一个对象,或者是0值(0值表明指针不指向任何对象) 指针也可使用预处理器变量NULL初始化,该变量在stdlib.h中定义,其值为0 void*指针 void*可以保存任何类型对象的地址,不允许使用void*指针操纵它所指向的对象 指针和引用 引用总是指向某个对象,定义引用时没有初始化是错误的; 给引用赋值修改的是该引用所关联的对象的值,引用一经初始化,就始终指向同一特定对象 使用指针访问数组元素 数组名是指向数组第一个元素的指针 C+

c++引用总结

佐手、 提交于 2020-02-15 08:13:59
引用做函数參数 struct Teacher { char name[64]; int age ; }; void printfT(Teacher *pT) { cout<<pT->age<<endl; } //pT是t1的别名 ,相当于改动了t1 void printfT2(Teacher &pT) { //cout<<pT.age<<endl; pT.age = 33; } //pT和t1的是两个不同的变量 void printfT3(Teacher pT) { cout<<pT.age<<endl; pT.age = 45; //仅仅会改动pT变量 ,不会改动t1变量 } void main() { Teacher t1; t1.age = 35; printfT(&t1); printfT2(t1); //pT是t1的别名 printf("t1.age:%d \n", t1.age); //33 printfT3(t1) ;// pT是形參 ,t1 copy一份数据 给pT //---> pT = t1 printf("t1.age:%d \n", t1.age); //35 cout<<"hello..."<<endl; system("pause"); return ; } 引用的本质 struct Teacer { int &a; //4个字节,相似指针 int &b