自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Willwilling

学习之路

  • 博客(96)
  • 收藏
  • 关注

原创 Qt中的多线程及其应用(1)

一、进程与线程的概念什么是程序?程序是计算机存储系统中的数据文件。分为源代码程序和可执行程序。源代码程序一般为文本文件,用来描述程序的行为和功能,可执行程序一般为二进制文件,可以直接加载并执行。源代码程序经过编译器编译,就成为可执行程序。什么是进程?广义的概念认为是程序关于某个数据集合的一次运行活动,狭义地讲,就是程序被加载到内存中后,执行得到的进程。程序和进程的区别:程序是硬盘中的静态文件,是存...

2018-03-30 22:35:56 483

转载 C++ STL中的 iterator 和 const_iterator

我们在C++中使用STL的容器时,经常会用到迭代器。使用迭代器可以很方便的进行容器元素遍历和修改等操作。近日,在使用Visual Studio 2015编程的时候发现,set的迭代器直接就是const_iterator类型,而vector的迭代器则是普通的iterator类型,这是为什么呢?今天就和大家一起来探究一下。Set/Map类型1 set<int>::iterat...

2018-07-24 21:05:24 354

转载 回调函数的实质——什么是回调函数,为什么要使用回调函数

在C/C++里面,函数的概念很好理解,就是把某个任务独立出来,封装在一起,然后给它取个名字,它可以有参数和返回值。那么,回调函数是个什么鬼呢?它和函数到底有何异同?既然已经有了函数,为啥还非要生出个回调函数来?想必,小伙伴们在刚碰到这个概念的时候,都会被这些问题困扰。网上搜一搜,有很多相关的材料,但是未必透彻。我觉得要真正理解一个概念,必须要先理解它存在的意义,也就是它为什么要存在,它能带来什么方...

2018-07-24 21:03:27 580

转载 C++插件架构浅谈与初步实现

一、插件架构初步介绍    想到写本博客,也没想到更好的名字,目前就先命这个名吧。说到插件架构,或许大部分IT从业者都听过或者某些牛人也自己实现过稳定高效的插件框架。目前有很多软件以及库都是基于插件架构,例如PS、我所在行业的GIS软件如Arcgis、QGIS、还比如开源图形引擎OGRE以及OSG,这些都是插件架构,通过插件架构来进行功能的扩展。那到底什么是插件架构呢?我的理解是系统运行时在需...

2018-07-24 14:37:37 4982

转载 静态库与动态库

所谓静态库,就是在静态编译时由编译器到指定目录寻找并且进行链接,一旦链接完成,最终的可执行程序中就包含了该库文件中的所有有用信息,包括代码段、数据段等。所谓动态库,就是在应用程序运行时,由操作系统根据应用程序的请求,动态到指定目录下寻找并装载入内存中,同时需要进行地址重定向。 win32平台下,静态库通常后缀为.lib,动态库为.dll linux平台下,静态库通常后缀为.a,动态库为.so 从本...

2018-07-23 21:19:04 77

转载 .h 与 .hpp 文件

   hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再 将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。...

2018-07-23 21:09:50 71

原创 thread线程的join和detach

detach调用之后,目标线程就成为了守护线程,驻留后台运行,与之关联的std::thread对象失去对目标线程的关联,无法再通过std::thread对象取得该线程的控制权。当线程主函数执行完之后,线程就结束了,运行时库负责清理与该线程相关的资源。当一个thread对象到达生命期终点而关联线程还没有结束时,则thread对象取消与线程之间的关联,目标线程线程则变为分离线程继续运行。当调...

2018-07-23 20:18:45 229

转载 C++里面,什么时候使用std::wstring

看你要使用什么字符编码了, std::wstring主要用于 UTF-16编码的字符,而std::string主要用于存储单字节的字符( ASCII字符集 ),但是也可以用来保存UTF-8编码的字符。(UTF-8和UTF-16是UNICODE字符集的两种不同的字符编码)如果你的程序支持多种语言,那么使用UTF-16来处理字符会方便一些,因为该编码中的每个字符都占用2个字节;而UTF-8中的字符...

2018-07-23 18:49:41 13946 2

转载 C++11 中std::function和std::bind的用法

关于std::function 的用法: 可以理解成函数指针 :void printA(int a){ cout<<a<<endl;}std::function<void(int a)> func;func = printA;func(2);保存lambda表达式:std::function<void()> fu...

2018-07-23 18:30:25 97

转载 lambda表达式

c11新特性中加入了lambda表达式,所以Qt 也支持需在.pro文件中加入CONFIG += c++11#include<iostream>using namespace std;int main(){int a = 1;int b = 2;auto func = [=, &b](int c)->int {return b += a + c;};re...

2018-06-12 20:50:51 66

原创 XML是什么,它可以做什么?——XML详解

举几个栗子说明一下。比如,我们要给对方传输一段数据,数据内容是“too young,too simple,sometimes naive”,要将这段话按照属性拆分为三个数据的话,就是,年龄too young,阅历too simple,结果sometimes naive。我们都知道程序不像人,可以体会字面意思,并自动拆分出数据,因此,我们需要帮助程序做拆分,因此出现了各种各样的数据格式以及拆分方式。...

2018-06-12 15:54:54 121

原创 C语言进阶:第39课、程序中栈、堆、静态存储区

程序中的栈: 栈是现代计算机程序里最为重要的概念之一 栈在程序中用于维护函数调用上下文 函数中的参数和局部变量存储在栈上 栈需有后进先出的行为 栈保存了一个函数调用所需的维护信息 参数、返回地址、局部变量、调用上下文。。。 以栈的方式记录活动信息 每次函数调用都对应着一个栈上的活动记录 调用函数的活动记录位于栈的中部 被调函数的活动记录位于栈的顶部 函数调用栈的变化: 通过层级调用,...

2018-05-22 23:00:08 91

原创 C语言进阶:第38课、动态内存分配

动态内存分配的意义: C语言中的一切操作都是基于内存的变量和数组等都是内存的别名 内存分配由编译器在编译期间决定 定义数组的时候必须指定数组长度 数组长度是在编译期就必须确定的需求:程序运行过程中,可能需要使用一些额外的内存空间 malloc 和 free 用于执行动态内存分配和释放 malloc所分配的是一块连续的内存 malloc以字节为单位,并且不带任何的类型信息 free用于将动态内存归...

2018-05-22 22:18:42 86

原创 C语言进阶:第37课:指针阅读技巧分析

下面的标识符代表是什么含义? int (*p)(int) int (*p1)(int*, int (*f)(int*)); int (*p2[5])(int*); int (*(*p3)[5])(int*); int* (*(*p4)(int*))(int*); int (*(*p5)(int*))[5];右左法则: 从最里层的圆括号中未定义的标识符看起 首先往右看,再往左...

2018-05-22 18:12:10 78

原创 C语言进阶:第36课、函数指针与回调函数

C语言中的函数有自己特定的类型函数的类型由返回值,参数类型和参数个数共同决定:int add(int, int)的类型为int(int , int )C语言通过typedef为函数类型重命名:typedef type name(parameter list)例: typedef int f(int, int) typedef void p(int)函数指针: 函数指针用于指向一个函数 函数名是执...

2018-05-22 16:30:23 98

原创 C语言进阶:第35课、数组参数和指针参数分析

为什么C语言中的数组参数会退化为指针?退化的意义: C语言中只会以值拷贝的方式传递参数 当向函数传递数组时: ??将整个数组拷贝一份传入函数(排除) 将数组名看做常量指针传数组首元素地址C语言以高效作为最初设计目标: 1.参数传递的时候如果拷贝整个数组执行效率会大大下降 2.参数位于栈上,太大的数组会导致栈溢出。(函数调用时,参数总是存储在栈上)二维数组参数同样存在退化问题:  二维数组可以看做...

2018-05-22 15:50:41 80

原创 C语言进阶:第34课:多维数组和多维指针(难点)

指向指针的指针指针的本质是变量指针会占用一定的内存空间可以定义指针的指针来保存指针变量的地址值。int main(){ int i=0; int* p = NULL; int** pp = NULL; pp = &p; *pp = &i;}为什么需要指向指针的指针? 指针在本质上也是变量 对于指针也同样存在传值调用和传址调用。#include <std...

2018-05-22 14:48:37 93

原创 C语言进阶:第33课、mian函数与命令行参数

C语言中main函数称为主函数,一个C程序是从main()函数开始执行。下面的main()函数定义正确吗:上面四种写法都是正确的!main()函数是操作系统调用的函数操作系统总是将main()函数作为应用程序的开始操作系统将main()函数的返回值作为程序的退出状态(return 0 的原因)思考:为什么C编译器支持那么多不同的main()函数原型???return num;num如果是0以外的其...

2018-05-22 00:02:37 83

原创 C语言进阶:第32课:数组指针和指针数组分析

下面的声明合法吗? int array[5]; int matrix[3][3]; int* pa = array; int* pm = matrix;array代表数组首元素的地址,那么matrix代表什么?array和&array的地址值相同,但是意义不同,那么他们所代表的类型相同吗?C语言中的数组有自己特定的类型: 数组的类型由【元素类型】和【数组大小】共同决定。 int ar...

2018-05-21 23:03:18 122

原创 C语言进阶:第31课:字符串典型问题分析

下面的程序输出什么,为什么? char buf[10] = {0}; char src[] = "hello %s"; snprintf(buf, sizeof(buf), src); printf("buf = %s\n", buf);编译运行:~/will$ gcc test.ctest.c: In function ‘main’:test.c:9: warning: for...

2018-05-21 22:03:24 72

原创 C语言进阶:第30课:C语言中的字符串

字符串的概念:字符串是有序字符的集合;字符串是程序中的基本元素之一;C语言中没有字符串的概念: C语言中通过特殊的字符数组模拟字符串; C语言中的字符串是以"\0"结尾的字符数组。C语言中,双引号引用的单个或多个字符是一种特殊的字面量 存储于程序的全局只读存储区;//被编译后存储于只读存储区 本质为字符数组,编译器自动在结尾加上"\0"字符。字符串字面量的本质是数组——不能被改变。#include...

2018-05-21 21:38:19 115

原创 C语言进阶:第29课:指针和数组分析(下)

数组名可以当做常量指针使用,那么指针是否也可以当做数组名来使用呢?数组的访问方式: 以下标的形式访问数组中的元素; 以指针的形式访问数组中的元素;指针以固定增量在数组中移动时,效率高于下标形式,指针增量为1且硬件具有增量模型时,效率更高。下标形式与指针形式的转换:a[n] <---> *(a+n) <---> *(n+a) <---> n[a]#include ...

2018-05-21 17:25:13 69

原创 C语言进阶:第28课:指针和数组分析(上)

数组的本质: 数组是一段连续的内存空间 数组的空间大小为sizeof(array_type)"array_size 数组名可以看做指向数组第一个元素的常量指针。 问题:  a+1的意义是什么?结果是什么?     指针运算的意义是什么?结果是什么?int main(){ int a[5] = {1, 2, 3, 4, 5}; int* p = NULL; ...

2018-05-21 11:54:27 76

原创 C语言进阶:第27课、数组的本质分析

数组是相同类型的变量的有序集合。int a[5]; // 5个int类型数据,每个元素都是int型数据;a代表数组第一个元素的起始地址。这20个字节空间的名字         为a,a[0]、a[1]等都是a中的元素,并非元素的名字。数组中的元素没有名字。数组的大小: 数组在一片连续的内存空间中存储元素 数组元素的个数可以显式或隐式指定int main(){ int a[...

2018-05-21 11:43:05 63

原创 C语言进阶:第26课、指针的本质分析

程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能访问这段存储空间?*号的意义: 在指针声明时,*号表示所表明的变量为指针; 在指针使用时,*号表示取指针所指向的内存空间中的值。 *号类似于一把钥匙,通过这把钥匙可以打开内存,读取内存中的值。 int i=0; int j=0; int* p=&i; //指针声明 j=*p; //取值划重点:变量p保存着变量...

2018-05-21 11:07:48 62

原创 C语言进阶:25、#和##操作符使用分析

#运算符#运算符用在预处理器期间将宏参数转换为字符串#的转换作用是在预处理器完成的,因此只在宏定义中有效编译器不知道#的转换作用用法: #define STRING(x) #x printf("%s\n", STRING(Hello World!)); //注意,并没有出现双引号对于下面代码:#include <stdio.h>#define STRING(x) #x...

2018-05-21 10:40:27 123

原创 C语言进阶:24、#pragma使用分析

#pragma用于指示完成一些特定的动作,并且所定义的很多指示字是编译器特有的。#pragma在不同的编译器间是不可移植的: ——预处理器将忽略它不认识的#pragma指令 ——不同的编译器可能以不同的方式解释一条#pragma指令。一般用法: #pragma parameter 注:不同的parameter参数语法和意义各不相同message参数在大多数的编译器中都有相似的实现;message...

2018-05-21 10:14:38 105

原创 C语言进阶:23、#error和#line的用法

#error用于生成一个编译错误消息用法: #error message message不需要用双引号包围#error编译指示字用于自定义程序员特有的编译错误消息,类似的,#warning用于生成编译警告。#error是一种预编译指示字,可用于提示编译条件是否满足#ifndef __cpluscplus //C++内置的宏 通过检测这个宏的存在,来进行错误提醒。#error This ...

2018-05-21 09:49:43 1302 1

原创 C语言进阶:22、条件编译使用分析

条件编译:同一份代码,产生不同的产品基本概念:条件编译的行为类似于C语言中的if...else...                条件编译是预编译指令命令,用于控制是否编译某段代码。#include <stdio.h>#define C 1int main(){ #if( 1 == C ) printf("this is first printf...\n"); #e...

2018-05-20 19:44:32 83

原创 C语言进阶:21、宏定义与使用分析

#define是预处理器处理的单元实体之一;#define定义的宏可以出现在程序的任意位置;#define定义之后的代码都可以使用这个宏。#define定义的宏常量可以直接使用;#define定义的宏常量本质为字面量(不占用内存<只读存储区>—和const常量(变量,占内存)的本质区别)。下面的宏定义正确吗?#define error -1                //#def...

2018-05-20 17:05:07 124

原创 C语言进阶48: 函数设计原则

函数设计原则:    函数在意义上应该是一个独立的功能模块    函数名要在一定程度上反应函数的功能    函数参数名要能够体现参数的意义    尽量避免在函数中使用全局变量!函数应该是无状态的,全局变量在函数体中是不受欢迎的。 void sc(char* s1, char* s2); void str_copy(char* str_dest, char* str_src);划重点: 当函数...

2018-05-20 16:34:39 72

原创 C语言进阶47:递归函数分析

递归是一种数学上分而治之的思想递归需要有边界条件 当边界条件不满足时,递归继续进行 当边界条件满足时,递归停止 递归将大型复杂问题转化为与原问题相同递归函数: 函数体内部可以调用自己递归函数中存在自我调用的函数递归函数是递归的数学思想在程序设计中的应用 递归函数必须有递归出口 函数的无限递归将导致程序栈溢出而崩溃计算字符串的长度:int strlen_r(const char* s){ if(...

2018-05-20 15:48:58 92

原创 C语言进阶46:函数和宏分析

宏除了定义常量,还可以定义代码块宏是由预处理器直接替换展开的,编译器不知道宏的存在函数是由编译器直接编译的实体,调用行为由编译器决定多次使用宏会导致可执行程序的体积增大函数是跳转执行的,内存中只有一份函数体存在(也就意味着函数调用有多余的开销)宏的效率比函数要高,因为是直接展开,无调用开销函数调用时会创建活动记录,效率不如宏#include <stdio.h>#define RES...

2018-05-20 15:09:50 90

原创 C语言进阶45:函数参数的秘密《下》——调用约定和可变参数程序

函数参数的计算次序是依赖于编译器实现的,那么函数参数的入栈次序是如何确定的呢?strcpy(s, "willwilling");哪个参数先入栈呢?——s先入栈。调用约定: 参数会传递给被调用的函数 返回值会被返回给函数调用者调用约定描述参数如何传递到栈中以及栈的维护方式 参数传递顺序 调用栈清理调用约定是编译器的一部分,且各个编译器的调用约定并不相同。调用约定是预定义的,可理解为调用协议调用阅读通...

2018-05-20 12:24:33 137

原创 C语言进阶44:函数参数的秘密《上》——参数访问顺序和程序点

函数参数在本质上与局部变量相同,都是在栈上分配空间函数参数的初始值是函数调用时的实参值观察下面代码,判断输出:   int k=1;     printf("%d, %d\n", k++, k++); (划重点) printf("%d\n", k);编译运行后输出结果:~/will$ ./a.out2, 13所以我们必须注意,函数参数的求值顺序依赖于编译器的实现不能假...

2018-05-20 12:05:39 237

原创 C语言进阶43:函数的意义——模块化设计和extern

函数的由来:    程序 = 算法 + 数据  C程序 = 数据 + 函数面向过程的程序设计: 面向过程是一种以过程为中心的编程思想 首先将复杂的问题分解为一个个容易解决的问题 分解过后的问题可以按照步骤一步步完成 函数是面向过程在C语言中的实现 解决问题的每个步骤可以用函数实现函数声明与函数定义: 声明的意义在于告诉编译器程序单元的存在 定义则明确指示程序单元的意义 C语言中通过extern进行...

2018-05-20 11:12:16 138

原创 C语言进阶42:内存操作经典问题《二》——常见内存错误与malloc()和free()函数

常见内存错误: 结构体指针未初始化 *** 结构体成员指针未分配足够的内存 内存分配成功但未初始化 *** 内存操作越界动态内存申请之后,应该立即检查指针值是否为NULL,防止使用NULL指针:int* p = (int*) malloc(56);if ( p != NULL){ //do something...}free(p);free指针之后必须立即赋值为NULL:in...

2018-05-19 16:32:22 66

原创 C语言进阶41:内存操作经典问题《一》——野指针

野指针: 指针变量中的值是非法的内存地址,进而形成野指针 野指针不是NULL指针,是指向不可用内存地址的指针 NULL指针并不危害,很好判断,也很好调试 C语言中无法判断一个指针所保存的地址是否合法一个指针指向malloc申请的内存地址,其实指针是有效的,但是调用free后,这个地址将返还给内存,这个地址将不可用指针将变成野指针。野指针的由来: 局部指针变量没有被初始化(指针变量定义的时候应该被初...

2018-05-19 16:17:36 154

原创 40、程序中的内存布局

先看一张示意图:不同代码在可执行程序中的对应关系    程序和进程的不同:     程序是 静态的 概念,表现形式为一个可执行文件 进程是 动态的 概念,程序由操作系统加载运行后得到进程 每个程序可以对应多个进程 每个进程只能对应一个程序问题:包含脚本代码的文本文件是一种类型的可执行程序吗?如果是,对应什么样的进程呢?脚本程序是一种可执行程序,但是它需要操作系统加载脚本解释程序来生成进程,然后进程...

2018-05-19 15:12:31 801 1

原创 memset()函数

    将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作。void *memset(void *s, char ch, unsigned n);”    将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值有什么用?为什么说“这个函数通常为新申请的内存做初始化工作?答:刚分配的内存空间,或...

2018-05-17 19:51:06 51

空空如也

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除