- 博客(38)
- 收藏
- 关注
原创 C++函数重载---底层实现原理
C++编写的代码,若去调用C编出来的库,是行不通的,因为C代码编译并不会发生命名倾轧行为,而C++代码编译会产生命名倾轧行为,所以函数名不匹配,则无法调用到C库中的函数。所以加入两个函数名相同的函数在编译之后的函数名也照样相同;消除倾轧的方法,在C++代码包含C库的头文件,加入extern “C”。总之一句话,倾轧是C++为了实现函数重载而设计的,不倾轧的extern “C”则是为了兼容C而后实现的。在.cpp文件中,虽然两个函数的函数名一样,但是他们在符号表中生成的名称不一样。
2020-06-24 14:47:57
2022
原创 C到C++学习感悟---对比学习
面向过程就是分析并解决问题,并将解决问题的步骤一步一步的实现,使用时依次调用就行;面向对象就是把问题分解成各个对象,建立对象的目的不是为了完成某一个步骤,而是为了描述某个事物在整个问题的步骤中的行为
2020-06-24 13:09:50
487
原创 关于malloc(0)的对与错
当malloc分配内存时它除了分配我们指定SIZE的内存块,还会分配额外的内存来存储我们的内存块信息,用于维护该内存块。
2020-06-23 22:57:10
599
转载 Android心得4.3--SQLite数据库--execSQL()和rawQuery()方法
1. 除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据。在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BL...
2020-06-01 15:50:07
846
原创 Makefile学习总结
一个工程中的源文件不计其数,按其功能、类型、模块放在若干个目录中,makefile定义了一系列的规则来指定,那些文件需要先编译,那些文件需要后编译,以及那些文件需要重新编译,甚至更复杂的功能操作。 makefile的优势是“自动化编译”,一旦写好,只需一个make指令,整个工程自动编译,极大地提高了软件开发效率。make是一个解释makefile中指令的一个命令工具。1、特殊的符号 &
2020-05-25 20:37:09
379
原创 五笔输入法
五笔输入法:横: G:王旁青头戋(兼)五一 F:土士二干十寸雨 D:大犬三羊古石厂 S:木丁西 A:工戈草头右框七 竖: H:目具上止卜虎皮 J:日早两竖与虫依 K:口与川,字根稀 L:田甲方框四车力 M:山由贝,下框几 撇: T:禾竹一撇双人立,反文条头共三一 R:白手看头三二斤 E:月彡(衫)乃用家衣底 W:人和八,登祭三四里 Q:金勺缺点无尾鱼,犬旁...
2019-11-17 16:36:21
637
原创 Linux网络编程---IO复用之select函数
1、概念: select机制提供了一个数据结构 struct fd_set,可以理解为一个集合,实际上是一个位图,每一个特定位代表一个相应的文件描述符,即文件句柄。fd_set集合可以通过一些宏由人为来操作。2、函数原型:#include <sys/time.h>#include <sys/types.h>#include <unistd.h>int...
2019-10-30 18:51:48
130
原创 Linux网络编程---IO复用之poll函数
函数原型#include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);struct pollfd { int fd; /* file descriptor */ 文件描述符 short events; /* requested events */ 请求...
2019-10-30 11:20:31
396
原创 Ubuntu 16.04 source list
Aliyun 亲测管用deb http://mirrors.aliyun.com/ubuntu/ xenial main restricteddeb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricteddeb http://mirrors.aliyun.com/ubuntu/ xenial universedeb ...
2019-10-29 09:40:43
1327
原创 Linux就该这样学
Linux文件存储结构:一个文件由目录项、inode、数据块组成目录项:包含文件名和inode节点号inode:文件索引点,除文件名以外的属性,以及数据块的指针数据块:文件的具体内容第一组:ls 查看属性mv 移动或重命名cp 复制文件rm 删除文件第二组:cat 显示文件 -A显示隐藏字符head 显示文件头几行tail 显示文件末几行less/more 分屏显...
2019-10-28 14:21:14
284
原创 简单TCP通信模型
在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket。int socket(int domain, int type, int protocol); 成功文件描述符,失败-1流式套接字:非帧同步数据报套接字:帧同步htonl()、htons() 主机字节序转换成网络字节序ntohl()、ntohs() 网络字...
2019-10-28 14:05:39
633
转载 STM32的IWDG使用
关于独立看门狗,很简单,打开喂狗,就这么简单,很多书上讲了很多什么寄存器什么的,对于初学者而言,这些还不是很重要,重要的是先学会用,用了之后慢慢去消化,为什么这东西要这么设置。好了下面来看看我的程序,很简单:void Iwdg_Init(void){IWDG_WriteAccessCmd(IWDG_Wr...
2019-05-08 19:57:37
908
原创 浅谈对select函数的理解
select机制中提供了一个数据结构 struct fd_set,可以理解为一个集合,实际上是一个位图,每一个特定位代表一个相应的文件描述符,这个集合中存放的是文件描述符,即文件句柄。fd_set集合可以通过一些宏由人为来操作,程序员通过4类宏,来完成对fd_set的操作<1> FD_ZERO(fd_set*) 清空一个文件描述符集合<2>FD_SET(int, ...
2019-04-23 12:23:53
392
转载 数据帧、数据包、数据报三者区分
首先我们有清楚,信息交换是发生在OSI模型中的相同层面,即:等层信息交换,源机中每一层都把信控制信息附加在数据中,而目的机器的每一层都会都接收到的信息进行分析,并从数据中移除控制信息在开始之前,需要先了解一下什么是数据单元?数据单元(data unit)是网络信息传输的基本单位。一般网...
2019-04-21 14:42:52
1857
转载 数据帧、数据包、数据报以及数据段 详解
数据帧、数据包、数据报以及数据段 OSI参考模型的各层传输的数据和控制信息具有多种格式,常用的信息格式包括帧、数据包、数据报、段、消息、元素和数据单元。 信息交换发生在对等OSI层之间,在源端机中每一层把控制信息附加到数据中,而目的机器的每一层则对接收到的信息进行分析,并从数据中移去控制信息,下面是各信息单元的说明:数据帧(Frame):是一种信息单位,它的起始点...
2019-04-21 14:15:17
5760
原创 MAC地址和IP地址的区别
基础知识 标识网络中的一台计算机,一般至少有三种方法,最常用的是域名地址、IP地址和MAC地址,分别对应应用层、网络层、物理层。网络管理一般就是在网络层针对IP地址进行管理,但由于一台计算机的IP地址可以由用户自行设定,管理起来相对困难,MAC地址一般不可更改,所以把IP地址同MAC地址组合到一起管理就成为常见的管理方式。一. 什么是MAC地址 MAC地址就是在媒体接入层上使用的地址,也叫...
2019-04-20 13:54:30
14093
6
翻译 select 函数在 socket 通信中的作用
1.函数原型int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);2.函数说明 select()用来等待文件描述词状态的改变。参数n代表最大的文件描述词加1,参数readfds、writefds 和exceptfds 称为描述词组,是用来回传该描述词的读...
2019-04-19 15:03:32
254
原创 C&&C++ 笔试常见关键字
volatile:防止变量被优化 <1>当读取一个变量时,为提高存取速度,编译器优化时会先把变量读取到一个寄存器中;以后取变量时,就直接从寄存器中取值 <2>用volatile声明的变量表示该变量可能随时发生变化,与该变量有关的运算,直接从变量的地址处取值 static: <1>默认初始化为0 <2>延长了局部变量的生命周期,...
2019-04-15 13:57:43
285
原创 stm32定时器的配置步骤
STM32F1定时器介绍: 由两个基本定时器(TIM6、TIM7),4个通用定时器(TIM2—TIM5),2个高级定时器(TIM1、TIM8);基本定时器结构功能简单,类似于51单片机中的定时器,通用定时器在基本定时器基础上扩展而来,增加了输入捕获和输出比较等功能,高级定时器在通用定时器的基础上扩展而来,增加了可编程死区互补输出、重复计数器、带刹车(断路)功能。通用定时器的配置步骤:&l...
2019-04-10 19:02:46
10044
原创 系统时钟 SysTick
什么是 SysTick?CM3的内核中包含一个SysTick时钟。SysTick为一个24位的递减计数器,SysTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。当计数到0后,SysTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会被置1,触发中断。中断响应属于NVIC异常,异常号为15SysTick定时器寄存器<1> CTRL 寄存器CTR...
2019-04-07 13:00:18
2430
原创 运算符的重载
将运算符重载为类的成员函数,一般形式为:class 类名{ //类体 ……… 返回类型 operator 运算符号(形式参数列表) { 函数体 } ……};当运算符重载为成员函数时,运算符函数的形式参数的个数比运算符规定的运算对象个数少一个。因为是类的非静态成员函数都有一个隐含的this指针,运算符函数可以用this指针隐式的访问类对象的成员,因...
2019-04-06 11:51:20
446
原创 指向类的成员的指针
在C++语言中,指向类的成员的指针包括指向类的数据成员和成员函数这两种指针。例如,有如下一个类:class A{ public: int fun(int b){ return a*c+b; } A(int i){ a = i; } int c; private: int a;};1.定义一个指向类A的数据成员c的指针pc,格式如下:in...
2019-04-05 19:38:04
245
原创 静态联编和动态联编的差异
静态联编: 在编译阶段将函数实现和函数调用绑定起来称为静态联编,C语言中,所有联编都是静态联编,C++ 一般情况下也是静态联编
2019-04-04 13:09:34
742
原创 C++学生管理系统 数据同步数据库
编写代码前,首先配置一下项目属性,具体见此链接源代码:#include <Windows.h>#include <mysql.h>#include <iostream>#include <iomanip>using namespace std;void mysql_test(); //进入学生系统void mysql_inse...
2019-04-03 22:50:31
6225
4
原创 多继承的“二义性”问题
一般来说,在派生类中对基类成员的访问应该是唯一的,但是,由于在多继承情况下,可能出现对基类中某个成员的访问不唯一性情况,这称为对基类成员访问的多继承二义性问题分两种情况:first: 派生类的多个基类中调用其同名成员时可能出现二义性second:派生类有共同基类时访问公共基类成员可能出现二义性例子:#include <iostream>using namespace std...
2019-04-03 14:27:29
1352
原创 vs2013连接mysql
源代码:#include <Windows.h>#include <mysql.h>#include <iostream>using namespace std;int main(){ MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; mysql_init(&mysql); if (!m...
2019-04-02 23:48:01
821
原创 “vector” 中的 “iterator”
Vector and Iterator 向量vector是C++标准模板库中的内容。vector是一个容器,他能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小,使用向量时需要在程序中添加< vector>头文件 所有的标准库容器类都定义了相应的iterator容器,如vector, vector::iterator iter; ...
2019-04-02 19:58:17
9695
原创 C++类模板(新手必备)
为什么要定义类模板呢先看一个例子:两个数求和#include <iostream>using namespace std;class Test{ public: Test(int a, int b) { x = a; y = b; } int add() { return (x + y); } privat...
2019-04-01 21:34:05
340
原创 深拷贝与浅拷贝的异同
默认的拷贝构造函数 如果一个类中没有定义拷贝构造函数,则系统会自动提供一个默认拷贝构造函数,用来根据已有对象创建新对象;我们要知道这个默认的拷贝构造函数采用的是"浅拷贝“,并非"深拷贝“。深拷贝与浅拷贝的区别浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间;深拷贝不仅对指针拷贝,对指针指向的内容也进行拷贝,深拷贝后的两个指针分别指向不同的内存空间浅拷贝带来的问题1. 浅拷贝后的...
2019-04-01 18:15:56
379
原创 浅谈 文件IO和标准IO
基本概念文件IO: 不带缓冲区的IO,每一次read,write都调用内核中的一个系统调用,称之为低级IO,操作系统提供的基本IO服务,与OS绑定,特定于Linux和Unix平台标准IO: 标准IO处理了很多细节,对文件IO进行了封装,可移植性高,提供缓冲区(全缓冲、行缓冲、不带缓冲)区别: 通过文件IO读写文件时,会频繁的进行系统调用,这样就增加了系统的开销;而标准I/O可以看成是在文件I...
2019-03-31 23:06:17
545
原创 指针和引用的区别和联系
指针的优势<1>动态分配内存<2>可以实现址传递<3>方便处理字符串<4>高效的使用数组指针和引用的区别本质区别:指针是地址,引用是别名 1. 指针可以改变它所指向的值,而引用一旦与某个变量绑定后就不再改变2. 系统给指针分配内存空间,不给引用分配内存空间3. 引用不能为空,指针可以为空代码如下:#include <ios...
2019-03-31 20:46:46
374
原创 浅谈 C++“引用”
变量的引用引用:就是给某一变量起个别名,对引用的操作等价于对变量的操作引用的声明方法:类型标识符 &引用名 = 目标变量名例如:char ch;char &p = ch;<1>引用仅是变量的别名,而不是定义了一个变量,因此不占用内存空间,而是和目标变量共同指向目标变量的内存地址<2>表达式中的取地址符&不再是取变量的地址,而是用来表示该...
2019-03-31 19:17:10
244
原创 Linux下静态库和动态库的生成
1.何为静态库……何为动态库……?Windows下:.dll 是动态库 .lib是静态库Linux下: .so是动态库 .a是静态库 静态库: 在生成可执行程序的时候,会把函数的具体执行方式封装到程序中,程序体积比较大,只要能编译成功,就可以在任意相同的平台上运行动态库:在生成可执行程序的时候,只会把函数的接口封装到程序中,体积较小,在程序开始运行时,才调用函数的具体执行...
2019-03-31 15:46:31
223
原创 C++ 利用new和delete创建和释放动态数组
创建并释放一维数组#include <iostream>using namespace std;int main(){ int n; cin >> n; int *arr = new int[10];//分配一维数组 for (int i = 0; i < n; i++) cin >> arr[i]; for (int i = 0...
2019-03-31 13:45:11
447
原创 用 "指针" 指向二维数组
常规法:数组指针:int a[2][3] = { 1, 2, 3, 4, 5, 6 }; for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) cout <<*(a[i]+j)<< endl;//*(a[i]+j)等价于*(*(a+i)+j)指针法:定义行指针:类型标识符 (*指针变...
2019-03-31 12:44:31
2659
原创 C++ new和delete malloc和free详解
先说一下两者的区别1.属性new/delete是C++关键字,需要编译器支持malloc/free是库函数,需要头文件支持2.参数使用new申请内存空间时无需指定内存块的大小,编译器会根据类型信息自行计算;而malloc则需要显式的指出所需内存的尺寸3.返回类型new申请成功时返回与对象类型相同的指针,无须进行类型转换;而malloc内存分配成功时返回void * ,需要通过强制类型...
2019-03-31 10:37:21
497
翻译 Linux内核结构体container_of的宏定义
container_of宏定义#define offsetof(TYPE,MEMBER)((size_t)&((TYPE*)0)->MEMBER)#define XXX(ptr,type,member)({\ const typeof(((type*)0)->member)*__mptr=(ptr);\ (type*)((char*)__mptr – off...
2019-03-31 00:18:23
308
原创 C++ 生成随机数
C++借助 rand() 和 srand() 函数产生随机数,由于rand()函数内部实现的是用线性同余法做的,所以生成的并不是真正的随机数,而是在一定范围内可看为随机数的伪随机数rand()单纯的rand()函数会返回一个随机数,不过它是一次性的,因为系统默认的随机数种子为1,只要随机数种子不变,其生成的随机数序列就不会改变srand()srand()可用来设置rand()产生随机数时的...
2019-03-30 22:29:35
340
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人