c/c++
张哲and哲哥
做一个徘徊在牛A和牛C之间的人
展开
-
指针杂谈
char buf[256] 一维数组,每个元素为一个字符 char *pbuf[256] 一维数组,每个元素为一个指针,都可以指向上面定义的那个一维字符数组,所以说相当于二维数组,例如:pbuf[0][0] = buf[0]; char **ppbuf[256] 每个元素为一个指向指针的指针,即都可以指向上面定义的那个一维指针数组,应该相当于三维了吧,例如:ppbuf[0][0][0] = p...原创 2018-09-06 10:37:15 · 167 阅读 · 0 评论 -
静态成员变量成员函数
C中的static1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。//a.cchar a = 'A'; // global variablevoid msg(){ printf("...原创 2019-08-20 09:58:08 · 206 阅读 · 0 评论 -
函数指针
#include<stdio.h>typedef void (*fun)(void) ;void Fun1(void){ printf("Fun1 Run\n");}void Fun2(void){ printf("Fun2 Run\n");}int main(){ fun p; p=Fun1; //两者类型匹配。 p(); // p=Fun2; (...原创 2019-08-19 20:56:56 · 97 阅读 · 0 评论 -
protobuf的使用
首先安装C++的Protobuf,按官方指导来: https://github.com/protocolbuffers/protobuf/tree/master/src下载release包,解压后编译安装即可。用法举例,先定义proto文件,如何定义protobuf网上有很多教程:syntax = "proto3";//实际使用中一般把package注释掉package test;e...原创 2019-08-06 19:55:44 · 273 阅读 · 0 评论 -
c和c++中的const
c中的const是冒牌货int main(){ const int a = 10; int *p = NULL; p = (int *)&a; *p = 20; //间接赋值 printf("a:%d \n", a); printf("*p:%d \n", *p); return 0;}分别使用c编辑器和c++的编辑器,...原创 2019-08-08 17:00:27 · 149 阅读 · 0 评论 -
c++中map的使用
map的插入 map<int, string> map1; //方法1 map1.insert(pair<int, string>(1,"teacher01") ); map1.insert(pair<int, string>(2,"teacher02") ); //方法2 map1.insert(make_pa...原创 2019-07-27 20:24:11 · 185 阅读 · 0 评论 -
linux中的线程安全性
互斥量mutexLinux中提供一把互斥锁mutex(也称之为互斥量)。每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。资源还是共享的,线程间也还是竞争的, 但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。但,应注意:同一时刻,只能有一个线程持有该锁。当A线程对某个全局变量加锁访问,B在访问前尝试加锁,拿不到锁,B阻塞。C线程...原创 2019-07-26 19:53:20 · 323 阅读 · 0 评论 -
c++中随机性的结合使用srand()和rand()的结合使用
首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)根据需要多次调用rand(),从而不间断地得到新的随机数;无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。#include<iostre...原创 2019-07-26 19:11:45 · 193 阅读 · 0 评论 -
c++中的异常类
转载:https://blog.51cto.com/11134889/20688771、C语言异常处理1.1、异常的概念异常:程序在运行过程中可能产生异常(是程序运行时可预料的执行分支),如:运行时除0的情况,需要打开的外部文件不存在的情况,数组访问越界的情况…Bug:bug是程序中的错误,是不可被预期运行方式,如:野指针、堆内存结束后未释放、选择排序无法处理长度为0的数组…1.2、C语...转载 2019-07-30 21:20:27 · 1061 阅读 · 0 评论 -
友元函数
#include <iostream>using namespace std;class A{public: friend class B;//B类 是 A的好朋友 ,在B中可以访问A类的私有成员 私有函数 //1 声明的位置 和 public private没有关系 friend void modifyA(A *pA, int _a); //2 函数modifyA ...原创 2019-08-20 14:43:19 · 240 阅读 · 0 评论 -
c++中的继承
1)C++中的继承方式会影响子类的对外访问属性 public继承:父类成员在子类中保持原有访问级别private继承:父类成员在子类中变为private成员protected继承:父类中public成员会变成protected 父类中protected成员仍然为protected...原创 2019-08-20 16:42:50 · 109 阅读 · 0 评论 -
网络基础
网络基础一、模型1.物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。2.数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据...原创 2019-09-03 20:02:35 · 427 阅读 · 0 评论 -
c中内存对齐
要了解为什么要内存对齐,首先我们要了解什么是内存对齐什么是内存对齐关于什么是内存对齐,我们先来看几个例子typedef struct {int a;double b;short c;}A;typedef struct {int a;short b;double c;}B;分别对他们求大小,sizeof(A),sizeof(B)我们所得到的结果是不同的,sizeof(A)...转载 2019-08-27 15:15:52 · 188 阅读 · 0 评论 -
纯虚函数和抽象类
纯虚函数在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该类的派生类去做(派生类必须要实现)。在基类中实现纯虚函数的方法是在函数原型后加“=0”。声明形式:virtual void fun()=0;虚函数在函数中可以有实现部分纯虚函数的基本用法#include <iostream>using namespace std;////面向抽...原创 2019-08-22 21:20:57 · 148 阅读 · 0 评论 -
对象的构造和析构
创建一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值。注意,类的数据成员是不能在声明类时初始化的。为了解决这个问题,C++编译器提供了构造函数(constructor)来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。1构造和析构函数1构造函数和析构函数的概念有关构造函数 1构造函数定义及调用1)...原创 2019-08-17 21:38:42 · 891 阅读 · 0 评论 -
sscanf的用法
C 库函数 int sscanf(const char *str, const char *format, …) 从字符串读取格式化输入。#include<stdio.h>int main(){ char buf[512]={0}; //1. 常见用法。 sscanf("123456 asdf","%s", buf); printf("%s\n",...原创 2019-08-13 10:32:43 · 314 阅读 · 0 评论 -
c++中字符串分割(split)
函数第一次调用需设置两个参数。第一次分割的结果,返回串中第一个" " 之前的字符串,也就是上面的程序第一次输出abc。第二次调用该函数strtok(NULL," "),第一个参数设置为NULL。结果返回分割依据后面的字串,即第二次输出d。strtok是一个线程不安全的函数,因为它使用了静态分配的空间来存储被分割的字符串位置线程安全的函数叫strtok_r,运用strtok来判断ip或者ma...原创 2019-08-16 19:23:08 · 939 阅读 · 0 评论 -
gcc的使用
GCG -o选项用来指定输出文件,它的用法为:[infile] -o [outfile][infile] 表示输入文件(也即要处理的文件),它可以是源文件,也可以是汇编文件或者是目标文件;[outfile] 表示输出文件(也即处理的结果),它可以是预处理文件、目标文件、可执行文件等。[infile] 和 [outfile] 可以是一个文件,也可以是一组文件:如果 [infile] 是一组文...转载 2019-08-21 11:15:59 · 95 阅读 · 0 评论 -
Linux系统编程 进程间的通信
IPC方法Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。...原创 2019-08-15 21:55:48 · 282 阅读 · 0 评论 -
Linux进程、进程控制
进程相关概念程序和进程程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu、内存、打开的文件、设备、锁....)进程,是一个抽象的概念,与操作系统原理联系紧密。进程是活跃的程序,占用系统资源。在内存中执行。(程序运行起来,产生一个进程)程序 → 剧本(纸) 进程 → 戏(舞台、演员、灯光、道具...)同一个剧本可以在多个舞台同时上演。同样,同一个程序...原创 2019-08-02 20:18:43 · 163 阅读 · 0 评论 -
linux中的线程安全(二)
信号量进化版的互斥锁(1 --> N) 由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降。线程从并行执行,变成了串行执行。与直接使用单进程无异。 信号量,是相对折中的一种处理方式,既能保证...原创 2019-08-02 19:18:45 · 389 阅读 · 0 评论 -
c++中string的常用方法
参考链接:https://blog.csdn.net/iwts_24/article/details/79186881string常用操作#include<iostream>#include<string>using namespace std;int main(){ string s = "str233"; string f = "9"; ...原创 2019-03-23 21:16:29 · 364 阅读 · 0 评论 -
vector中定义二维数组
如果是普通的定义二维数组int **p;p = new int*[10]; //注意,int*[10]表示一个有10个元素的指针数组for (int i = 0; i < 10; ++i){ p[i] = new int[5];}定义一个二维整形数组并初始化如下是定义一个确定行数和列数的二维数组vector<vector<int> > ...原创 2019-03-21 17:00:48 · 8510 阅读 · 0 评论 -
对struct使用sort lower_bound以及运输符的重载
#include<iostream>#include<string.h>#include<algorithm>using namespace std;struct Node { int x; int y;};bool Cmpare(const Node &a, const Node &b) /...原创 2019-03-15 16:51:44 · 315 阅读 · 0 评论 -
extern的正确用法
在一个.h里面声明,但是不定义在另一个cpp里面定义,不能定义在.h里面容易产生重复定义的问题在其他cpp中应用了#include"search_extern.h",就可以使用filter这个变量了...原创 2019-01-23 16:58:24 · 172 阅读 · 0 评论 -
c++ pair的用法总结
定义和构造一个pair相当与一个数据而不是一组数据,不是和map一样,而是相当于一个int类型的数据。pair<int, double> p1; //使用默认构造函数pair<int, double> p2(1, 2.4); //用给定值初始化pair<int, double> p3(p2); //拷贝构造函数访问两个元素(通过first...原创 2019-01-29 11:36:03 · 282 阅读 · 0 评论 -
low_bound()函数的使用
https://www.cnblogs.com/is-Tina/p/7294067.html原创 2019-01-15 15:53:27 · 1138 阅读 · 0 评论 -
c++中auto的正确用法
查看gcc的版本gcc --versiongcc在4.7以后才支持c++ 11 vector<int> v; v.push_back(1); v.push_back(2); for (auto var = v.begin(); var != v.end(); ++var) { cout<<*var<<endl; }...原创 2019-01-03 09:57:23 · 2425 阅读 · 0 评论 -
c++ 中的malloc、 realloc和new
参考链接:https://www.cnblogs.com/zhanjxcom/p/5766844.htmlhttp://www.runoob.com/cprogramming/c-function-realloc.html动态内存的申请与释放必须配对,程序中malloc与free的使用次数一定要相同,否则肯定有错误(new/delete同理)malloc和new的效果相似,但是如果想追加内...原创 2018-12-26 16:44:43 · 881 阅读 · 0 评论 -
c++中set用法
set的用法参考链接:https://www.cnblogs.com/caiyishuai/p/8646345.html#include<set>#include<iostream>using namespace std;int main(){ set<int>s; int n; cin>>n; for(i...转载 2019-04-17 17:29:04 · 399 阅读 · 0 评论 -
c++中的虚函数和纯虚函数
参考链接:https://www.cnblogs.com/inception6-lxc/p/8597326.html转载 2019-04-17 17:33:46 · 88 阅读 · 0 评论 -
linux多线程之条件变量
转载:https://blog.csdn.net/qq_39736982/article/details/823806891、条件变量概述:条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等待另一个线程发送信号来弥补互斥锁的不足,所以互斥锁和条件...转载 2019-08-02 18:56:05 · 809 阅读 · 0 评论 -
Linux中time()函数用法
time函数获得日历时间。日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。#include <time.h...原创 2019-07-25 14:24:30 · 5156 阅读 · 0 评论 -
c++中避免头文件重复引用
//a.h#ifndef _A_H#define _A_Hclass A{pbulic:A(){}~A(){}}#endif// B.h#ifndef _B_H#define _B_H#include “a.h”class B : public A{public:B(){}~B(){}}#endif// C.h#ifndef _C_H#define _...原创 2019-07-29 15:50:43 · 658 阅读 · 0 评论 -
inline的使用
(1) inline函数的定义放在头文件中,在头文件中不能够写函数的实习,但是使用inline则可以写函数的实现inline 在大多数 C++ 程序中是编译行为。其次,因为内联函数要在调用点展开,所以编译器必须随处可见内联函数的定义,要不然就成了非内联函数的调用了。所以,这要求每个调用了内联函数的文件都出现了该内联函数的定义。因此,将内联函数的定义放在头文件里实现是合适的,省却你为每个文件实现一...原创 2019-07-02 19:30:20 · 335 阅读 · 0 评论 -
qt解决qdebug乱码
QVector<QString> s; s.push_back(QString::fromLocal8Bit("张三")); s.push_back(QString::fromLocal8Bit("李三")); s.push_back(QString::fromLocal8Bit("李四")); s.push_back(QString::from...原创 2019-07-02 16:54:11 · 1498 阅读 · 0 评论 -
c++中的应用
#include<iostream>#include<vector>using namespace std;vector<vector<int>> res;static vector<int> path;int main(){ path.push_back(1); path.push_back(2); ...原创 2019-05-07 18:39:24 · 188 阅读 · 0 评论 -
c++
vectorvector可理解为变长数组,它的内部实现基于倍增思想。按照下列思路可以大致实现一个 vector的实际长度和最大长度。向 vector 加入元素前,若n=m,则在内存中申请2m的连续空间,并把内容转移到新的地址上(同时释放旧的空间),再执行插入。从 vector中删除元素后若n≤m/4,则释放一半的空间。vector支持随机访问,即对于任意的下标0≤i<n,可以像数组一样用...原创 2019-04-19 17:38:47 · 189 阅读 · 0 评论 -
memset的使用
https://blog.csdn.net/qq1169091731/article/details/51934504原创 2019-05-01 17:20:33 · 228 阅读 · 0 评论 -
函数模板和类模板
函数模板1.1.1为什么要有函数模板需求:写n个函数,交换char类型、int类型、double类型变量的值。案例:#include <iostream>using namespace std;/*void myswap(int &a, int &b){ int t = a; a = b; b = t;}void ...原创 2019-08-26 11:24:23 · 158 阅读 · 0 评论