C++
文章平均质量分 62
C、C++
AquilaEAG
时间并不会改变什么,行动才会
展开
-
C++ 指针与引用的区别
1. 指针可以改变其绑定的变量,也可以不用初始化(不建议这么做,有危险)int x = 5;int y = 6;int *p;p = &x;p = &y;*p = 10;assert(x == 5);assert(y == 10);引用不可以,且必须初始化。int x = 5;int y = 6;int &r = x;2. 指针变量有自己的实际地址和所占空间的大小,x86 上一般是 32 位,但是引用是和它绑定的变量共享一个地址。int x = 0;i原创 2021-04-13 00:27:33 · 371 阅读 · 0 评论 -
C++ 变量初始化顺序
1.全局变量初始化顺序什么时候初始化根据 C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局变量的初始化可以划分为以下两个阶段(c++11 N3690 3.6.2):static initialization: 静态初始化指的是用常量来对变量进行初始化,主要包括 zero initialization 和 con原创 2021-04-12 21:45:23 · 3127 阅读 · 0 评论 -
gcc与g++的区别
gcc是gnu的c编译器g++是gnu的c++编译器gcc/g++在执行编译工作的时候,总共需要4步:预处理,生成.i的文件[预处理器cpp]将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]连接目标代码,生成可执行程序[链接器ld]1.两者都可以编译C和C++代码,但是请注意:(1) 后缀为.c的,GCC把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超原创 2021-04-12 17:00:01 · 238 阅读 · 0 评论 -
C++ 多线程交替输出1~100
使用互斥锁实现:互斥锁+自增判断奇偶代码:#include <iostream>#include <thread>#include <mutex>using namespace std;int number;mutex mutex_number;const int MAXNUM = 10;// 打印奇数void add_1() { while (1) { mutex_number.lock(); if (原创 2021-04-03 18:57:15 · 1465 阅读 · 0 评论 -
C++ 多线程实现死锁
什么是死锁——多个线程循环等待对方释放所需的资源一.死锁的发生1. 忘记释放锁void data_process(){ EnterCriticalSection(); if(/* error happens */) return; LeaveCriticalSection();}2. 单线程重复申请锁void sub_func(){ EnterCriticalSection(); do_something(); Lea原创 2021-04-02 15:17:26 · 682 阅读 · 0 评论 -
C++代码规范 (一)
Google C++ 编码规范:https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/对于高质量的工程,一般会做到:代码简洁精炼,美观,可读性好,高效率,高复用,可移植性好,高内聚,低耦合,没有冗余,不符合这些原则,必须特别说明。规范性,代码有规可循。特殊排版、特殊语法、特殊指令,必须特别说明。C++头文件与实现文件代码风格图例一、文件排版方面包含头文件 • 先系统头文转载 2021-03-26 19:07:26 · 713 阅读 · 0 评论 -
C语言 const修饰的指针变量
const修饰的指针变量int a = 100; int b = 200;//指向常量的指针 //修饰*,指针指向内存区域不能修改,指针指向可以变 const int *p1 = &a; //等价于int const *p1 = &a; //*p1 = 111; //err p1 = &b; //ok//指针常量 //修饰p1,指针指向不能变,指针指向...原创 2019-08-30 09:21:33 · 287 阅读 · 0 评论 -
【C/C++】C语言特性总结
【C/C++】C语言特性总结_链接](https://blog.csdn.net/qq_42322103/article/details/99071161)转载 2019-08-30 09:13:16 · 414 阅读 · 0 评论 -
C语言 数组指针&指针数组
Char *p1[] = {“123”,”456”,”789”};[]优先级高,先与p结合成为一个数组,再由char *说明这是一个字符型指针数组//这是一个指针数组、数组3x4、三个一维数组的首地址存放在以指针作为元素的数组中Char (*p2)[] = {“123”,”456”,”789”};//编译器只分配4个字节,是一个指针。...原创 2019-08-05 14:19:54 · 208 阅读 · 0 评论 -
C语言 数据类型转换
1.不同数据类型之间运算会进行自动类型转换:由低转高2.强制类型转换一般形式:(类型名)(表达式)例 (int)(x + y) (int)x + y (double)(3/2) (int)3.6 说明:强制转换得到所需类型的中间变量,原变量类型、变量值保持不变 。较高类型向较低类型转换时可能发生精度损失问题。3.类型间转换(1)格式...原创 2019-08-05 13:32:06 · 388 阅读 · 0 评论 -
C语言 char *、char []、const char *、string的区别与相互转换
1.VS运行程序,出现“烫烫烫烫烫烫烫烫烫…”在 Debug 模式下,VC 会把未初始化的栈内存全部填成 0xcc,当字符串看就是 烫烫烫烫……会把未初始化的堆内存全部填成 0xcd,当字符串看就是 屯屯屯屯……2. VS不可以char *p=“abcd”注意:编译器是把"abcd"作为“abcd\0”来处理的,有五个字符为什么要加上’\0’?,‘\0’代表空格符,在字符串结尾加...原创 2019-08-04 15:58:29 · 20748 阅读 · 1 评论 -
C语言 排错
排除错误,有两层含义,找到出错的代码,修改该代码。排错也有两种形式,一是静态排错,编译器和链接器发现的错误基本都属于这一类,通过观察源程序便能确定问题所在并改正它。另一种是动态排错,逻辑错误的发现和纠正都比较困难,要综合考虑代码、使用的数据和输出结果的关联,仔细思考,尝试更换数据,观察结果的改变,依此分析错误可能存在的地方。如果还是不行,就要使用动态检查机制,最基本的方法是“分而治之”,检查程...原创 2019-08-02 15:42:18 · 650 阅读 · 0 评论 -
C语言 程序的预编译、编译、链接
程序运行过程1.预处理“#include”和“#define”都属于编译预处理,C语言允许在程序中用预处理指令写一些命令行。预处理器在编译器之前根据指令更改程序文本。编译器看到的是预处理器修改过的代码文本,C语言的编译预处理功能主要包括宏定义、文件包含和条件编译3种。预处理器对宏进行替换,并将所包含的头文件整体插入源文件中,为后面要进行的编译做好准备。2.编译编译器处理的对象是由单...原创 2019-08-02 15:15:45 · 687 阅读 · 0 评论 -
C语言 内存四区
C语言内存分四个区:静态区,代码区,堆区,栈区2. 函数名存储了函数代码二进制段入口点的地址。3. 指针变量在栈区,它指向的内存是堆区,栈区是由系统管理的,不需要手动释放,堆区需要手动释放。4. 寄存器变量不在内存的四个区,在CPU内部。5. 栈区,堆区都是动态存储区,栈区调用的时候分配,用完的时候回收再次分配;堆区,自己自由分配,自己决定何时分配何时回收;代码区和静态区就一直与程序共存...原创 2019-08-02 14:14:07 · 879 阅读 · 0 评论 -
C语言 局部变量与全局变量的生存期
1.局部变量仅仅在定义它的函数的内才能有效使用,其作用域仅限在函数体内,即从变量定义的位置开始,到函数体结束。2.局部变量的内存分配:通常,编译器不为局部变量分配内存单元,而是在程序运行中,当局部变量所在的函数被调用时,系统根据需要临时为其分配内存。当函数执行结束时,局部变量被撤销,占用内存被收回。注意:局部变量在函数被调用时由系统分配存储区,在不同的声明周期的函数中同名的变量实际上...原创 2019-08-01 19:56:29 · 6295 阅读 · 0 评论 -
C语言 内存操作函数
内存操作函数原创 2019-08-01 19:35:59 · 181 阅读 · 0 评论 -
C语言 函数的副本机制
函数副本机制1. 函数的参数的传递两种形式,传值与传地址。函数的输入-参数,函数的输出-返回值不仅可以是int,double等等也可以是数组,结构体等等。所谓副本机制,是指copy(拷贝)的思想,不论是传值调用还是传址调用,编译器都要为每个参数制作临时副本,或称拷贝,函数体中对参数的修改都是对副本的修改。1.将值传递给num,num并不会改变原来的值2.将地址传递给 *p, 会改变原来...原创 2019-08-01 17:57:14 · 2783 阅读 · 0 评论 -
C语言 文件的读写
文件的读写数据块IO fread与fwrite1.数据块I/O:fread与fwrite函数原型:size_t fread(void *buffer,size_t size, size_t count,FILE *fp)size_t fwrite(void *buffer,size_t size, size_t count,FILE *fp)功能:读/写数据块...原创 2019-07-31 16:48:44 · 313 阅读 · 0 评论 -
C语言 文件缓冲区
文件缓冲区缓冲区分为以下三种:1,流,标准库的IO缓冲区文件流操作函数(File *p)直接交互的都是C 标准库IO buffer,除open(), openat(), read(), write()等文件描述符相关的函数外,其他IO库函数进行IO操作的直接操作对象都是IO buffer。而且read,write等函数并不是直接从用户程序直接读写数据到磁盘而是与内核IO缓冲区交互。 ...原创 2019-07-31 16:15:57 · 2912 阅读 · 0 评论 -
C语言 文件的输入输出
C语言程序在进行文件操作时遵循如下操作步骤:打开->读写操作->关闭,通俗地说,打开是获取文件结构、系统为文件分配缓冲区的过程,不打开文件就不能对其进行读写,关闭是释放缓冲区和其他资源的过程,不关闭文件就会慢慢耗光系统资源。在进行文件操作时,系统自动与3个标准设备文件联系,这3个文件无需打开和关闭,它们的文件指针分别是:stdin:标准输入文件指针,系统分配为键盘。stdou...原创 2019-07-31 15:37:51 · 7680 阅读 · 2 评论 -
C语言 标准输入输出(stdio)的文件缓冲区
文件型结构体使用printf函数时,输出设备默认为标准输出设备(一般是显示器),因此,不需要告诉printf函数显示器在哪。但如果想从文件中读取输入,情况就不同了,系统中有不同的磁盘,每个磁盘又有成千上万的文件,到底应该从哪个读呢?要想对文件进行操作,系统需要很多控制信息,包括文件名,文件当前读写位置,缓冲区位置和大小等,为此,C语言提供了“文件型”结构来标示记录待操作文件的信息,该结构定义于...原创 2019-07-31 15:16:05 · 1436 阅读 · 0 评论 -
C语言 结构体的大小计算
示例:计算结构体的大小结构体中可以定义的数据类型:1.基本类型:基本类型是指像char、short、int、float、double这样的内置数据类型,诸如结构体、共用体和数组等都不是基本数据类型。2.上面已经出现过的数据类型,比如说上面已经定义过的结构体。3.指向自己的指针。【C语言】字节对齐示例:字节对齐1.原因——为什么要进行字节对齐1)平台原因(移植原因):不是所有的...原创 2019-07-30 16:32:11 · 771 阅读 · 0 评论 -
C语言 Unicode字符问题
1、使用多字节字符集运行正常把字符集改成Unicode。运行出现乱码2、char 只能是字母,数字,字符char字符串可以显示汉字,字符不可以,字符连在一起%c%c可以输出汉字3、 打印出2,说明ch占两个字节4、wprintf函数 通过%wc格式输出符 打印出一个汉字正常显示5、wprintf函数 通过%wc格式输出符 打印出一个汉字结果打印正常...原创 2019-07-29 20:26:21 · 3053 阅读 · 0 评论 -
C语言 字符串与数字的相互转换
1. 字符“12345”转化为12345int char2Num(char *str){char * istr=str; //// 保留副本()While(*str!=”\0”){if((*str)<’0’||(*str)>’9’){Return -1}*str++;num++;}printf(“%d”,num);int lastres=0;//12345 ...原创 2019-07-29 19:54:41 · 1088 阅读 · 0 评论 -
C语言 常用内存函数
C语言 常用内存函数1.memsetmemset在头文件memory.h中 头文件memory.h为内存操作函数头文件memset 第一个参数是内存的首地址,第二个参数是要设置的字符,第三个参数是正数,从首地址开始设置多少个字节为第二个参数memset多用于清空字符串 用法 memset(str,’\0’,strlen(str));实验代码与结果:2.memcpy 内存复制me...原创 2019-07-29 19:45:24 · 1301 阅读 · 0 评论 -
C语言 实现字符串常用函数
C语言实现字符串常用函数Strlen求字符串长度Strcpy字符串复制Strcat字符串粘贴strchr字符串查找strcmp字符串是否相等6. strstr字符串检索原创 2019-07-29 19:33:19 · 148 阅读 · 0 评论 -
C语言 字符串的输入输出
1、字符指针变量与字符数组char *cp; 与 char str[20];str由若干元素组成,每个元素放一个字符;而cp中存放字符串首地址 char str[20]; str=“I love China!”; () char *cp; cp=“I love China!”; ()str是地址常量;cp是地址变量c...原创 2019-07-29 15:49:02 · 992 阅读 · 0 评论 -
C语言printf格式控制符
printf用法大全,C语言printf格式控制符一览表转载 2019-07-29 15:38:03 · 541 阅读 · 0 评论 -
动态内存分配
第30讲 5.3.65动态分配1、malloc和free是C标准库中提供的两个函数,用以动态申请和释放内存,malloc()函数的基本调用格式为:2、void malloc( unsigned int size );3、参数size是个无符号整型数,用户由此控制申请内存的大小,执行成功时,系统会为程序开辟一块大小为size个内存字节的区域,并将该区域的首地址返回,用户可利用该地址管理并使用...原创 2019-07-27 19:16:13 · 482 阅读 · 0 评论 -
指针引用多维数组
指针引用多维数组对于二维数组:1、a是一个行指针。指向一个有四个元素的数组,占16个字节&a是一个指向二维数组的指针,二维数组有12个元素,占48个字节*a是一个指向int类型数据的指针。2、a[i][j]等价于*((a+i)+j) &a[i][j]等价于(a+i)+ja[i]等价于*(a+i) &a[i]3、 ...原创 2019-07-27 19:04:32 · 789 阅读 · 0 评论 -
指针+程序运行的内存管理
程序运行的内存载入过程:(1)程序要进行的操作对应的代码被装载到代码区。(2)全局和静态数据等装载到数据区(3)开辟堆栈,供临变量等使用。内存分配:1)静态存储区:主要存放static静态变量、全局变量、常量。这些数据内存在编译的时候就已经为他们分配好了内存,生命周期是整个程序从运行到结束。(2)栈区:存放局部变量。在执行函数的时候(包括main这样的函数),函数内的局部变量的存储单元...转载 2019-08-05 15:10:29 · 190 阅读 · 0 评论 -
32位与64位差别以及debug Release区别
**32位与64位差别以及debug Release区别**1、x86, x64编程的差别。x86 表示32位,x64 表示64位。32位,地址为32位 2^3264位,地址为64位 264=(232) * (2^32)32位情况:32位最大使用内存是?———4G地址为32位的地址范围:2^32方字节处理,内存的最大极限就是4G地址为64位的地址范围:2^64方字...原创 2019-07-27 16:53:39 · 1302 阅读 · 0 评论 -
C语言关键字
auto 局部变量(自动储存)break无条件退出程序最内层循环case switch语句中选择项char单字节整型数据const定义不可更改的常量值continue中断本次循环,并转向下一次循环default switch语句中的默认选择项do 用于构成do…while循环语句double定义双精度浮点型数据else构成if…else选择程序结构enum枚举exter...原创 2019-07-26 00:23:05 · 100 阅读 · 0 评论 -
cmd命令
CMD命令CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本、文件系统版本)appwiz.cpl:程序和功能calc:启动计算器certmgr.msc:证书管理实用程序charmap:启动字符映射表chkdsk.exe:Chkdsk磁盘检查(管理员身份运行命令提示符)cleanmgr: 打开磁盘清理工具cliconfg:SQL SERV...原创 2019-07-25 23:04:04 · 137 阅读 · 0 评论 -
C++ vector与unordered_map的扩容
测试代码:#include <iostream>#include <string>#include <unordered_map>#include <vector>using namespace std;int main(){ vector<int> vec; for (int i = 0; i < 190; i++) { vec.emplace_back(i); cout << &vec <原创 2021-03-21 19:02:53 · 2372 阅读 · 0 评论 -
C++ 反汇编
反汇编分析原创 2021-01-04 01:15:35 · 1756 阅读 · 0 评论 -
临界区
临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必须等待(例如:bounded waiting 等待法),有一些同步的机制必须在临界区段的进入点与离开点实现,以确保这些共用资源是被互斥获得使用,例如:semaphore。只能被单一线程访问的设备,例如:打印机。...原创 2020-10-19 19:25:52 · 242 阅读 · 0 评论 -
STL erase()函数踩坑
erase(iter),将导致iter失效,并返回指向下一个元素的迭代器#include <map>#include <vector>#include <set>#include <list>#include <iostream>using namespace std;int main() { int val = 6; vector<int> v = { 6,6,6 }; for (auto it = v.be原创 2020-09-23 17:27:24 · 300 阅读 · 0 评论 -
5. C 和 C++的区别
面试题——C/C++的区别与联系转载 2020-08-04 12:15:26 · 160 阅读 · 0 评论 -
4. new 与 malloc 的异同处
原创 2020-08-04 11:28:08 · 313 阅读 · 0 评论