
C/C++
gloryor
这个作者很懒,什么都没留下…
展开
-
RT-Thread的INIT_xxx_EXPORT 宏详解
【代码】RT-Thread的INIT_xxx_EXPORT 宏详解。转载 2022-09-24 10:12:27 · 1792 阅读 · 1 评论 -
指针作为函数形参
【代码】指针作为函数形参。原创 2022-09-24 10:07:14 · 1392 阅读 · 0 评论 -
Flash,ROM,RAM,EEPROM等区别和包含关系
Flash和EEPROM区别差异及关系解析-电子发烧友网EEPROM和flash的区别_yuanlulu的博客-优快云博客_eeprom和flash的区别ROM, FLASH和RAM的区别 - 知乎转载 2022-10-14 14:23:46 · 377 阅读 · 0 评论 -
C/C++中的volatile关键字
为什么使用volatile ?C/C++中的 volatile 关键字 和const对应,用来修饰变量,通常用于建立语言级别的memory barrier。volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统,硬件或者其他线程等。举例说明遇到这个关键字声明的变量, 编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int volatile vInt; 当要求使用 volatile 声明的变量的值的.转载 2021-09-28 19:35:29 · 233 阅读 · 0 评论 -
字母和数字的ASCII码应用
有时候在做有关字符的算法题经常出现字母和数字的转换得到的简便方法。#include <stdio.h>int main(void) { char a = 'a'; char b = 'A'; char c = '0'; printf("%d/n%d",a-b,b-c); return 0; }//输出3217...原创 2021-09-26 17:29:34 · 329 阅读 · 0 评论 -
多线程——线程的退出
一般来说,一个线程的退出,有多种方式:1.return方式/exit/_exit2.利用pthread_exit退出3.利用phread_cancel退出以下几种方式均可以让线程退出,但是相互间也是有区别的,下面通过实例来演示。pthread_exit函数用于实现线程退出头文件#include<pthread.h>函数原型void pthread_exit(void *retval);无返回值参数列表void *retval:返回的参数NULL...原创 2021-09-24 11:23:00 · 4420 阅读 · 0 评论 -
多线程——join与detach区别及代码实例
什么是分离和非分离用来决定一个线程以什么方式来终止自己。非分离:线程结束之后,需要主线程调用pthread_join()回收资源分离:一个线程结束时就立即释放它的所占有的所有系统资源pthread_join 的概念:pthread_join函数主要用来获得另一个线程的终止状态并且释放该线程所占的资源。当调用pthread_join()时,当前线程会处于阻塞状态,直到被调用的线程结束后,当前线程才会重新开始执行。当pthread_join()函数返回后,被调用线程才算真正意义上的结原创 2021-09-16 16:41:00 · 614 阅读 · 0 评论 -
空指针和野指针
空指针未初始化的指针或者初始化为0的指针int *ptr_1 = 0;int *ptr_2 = NULL;空指针使用*ptr 会报错。printf("%d\n",*p)野指针区别于空指针,野指针指向内存,该内存不可用,并且危险。形成原因指针未初始化任何指针变量被刚创建时不会被自动初始化为NULL指针,它的缺省值是随机的。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。char* p = NULL; char* s原创 2021-09-23 14:36:49 · 171 阅读 · 0 评论 -
strcpy与memcpy
memcpy#include <string.h>void *memcpy(void *dst,const void *src,unsigned int len){ if((NULL==dst)||(NULL==src)) return NULL; char *Strdst = (char *)dst; while(len--)*dst++=*src++; return Strd原创 2021-09-23 13:54:44 · 2294 阅读 · 0 评论 -
typedef 和 #define
概述typedef 为C语言的关键字,作用是为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。typedef 本身是一种存储类的关键字,与 auto、extern、static、register 等关键字不能出现在同一个表达式中。作用及用法typedef的用法使用 typedef 定义新类型的方法(步骤):在传统的变量声明表达式里,用(新的)类型名替换变量名,然后把关键字 typedef 加在该语句的开头就可以了。转载 2021-09-22 14:56:16 · 576 阅读 · 0 评论 -
C++查询变量类型
#include<iostream>#include<typeinfo>using namespace std;int main(){ char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char* str5 = "abc"; const char* str6 = "abc...原创 2021-09-17 14:50:32 · 395 阅读 · 0 评论 -
多线程——条件变量的概念和实现
概念条件变量,也称条件锁,是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:1)一个线程等待"条件变量的条件成立"而挂起;2)另一个线程使"条件成立"(给出条件成立信号)条件的检测是在互斥锁的保护下进行的如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。如果两进程共享可读写的内存,条件变量可以被用来实现这两进程间的线程同步函数API原创 2021-09-16 17:37:31 · 1312 阅读 · 0 评论 -
vscode插件分享
这里原创 2021-09-14 14:19:10 · 84 阅读 · 0 评论 -
deque与vector的区别
概念deque与vector非常相似。它也采用动态数组管理元素,提供随机存取,有着和vector几乎一样的接口。不同的是deque的动态数组头尾都开放,因此能在头尾两端进行快速安插和删除。deque通常实作为一组独立区块,第一区块朝某方向扩展,最后一个区块朝另一个方向扩展。deque与vector的主要不同之处在于:1. 两端都能快速安插和删除元素,这些操作可以在分期摊还的常数时间(amortized constant time)内完成。2. 元素的存取和迭代器的动作比vector稍转载 2021-09-13 17:51:23 · 290 阅读 · 0 评论 -
C/C++预编译指令
//条件编译 #define // 宏定义 #undef // 取消宏 #include // 文本包含 #ifdef // 如果宏被定义就进行编译 #ifndef // 如果宏未被定义就进行编译 #if defined // 与ifdefine的区别在于可以可以组成复杂的判别条件 #if !defined // 与if !d.原创 2021-09-13 11:01:56 · 786 阅读 · 0 评论 -
可重入函数——学习笔记
什么是可重入函数?在 实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果这个函数不幸被设计成为不可重入的函数的话,那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果。可重入性是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。一般理解是一个函数在同时多次调用,在输入一定的情况下,输出结果必然固定, 不受任何其他情况的影响。比如int n = 0;//全局变量 int fun(int x){ n += x; retu原创 2021-09-13 10:57:05 · 322 阅读 · 0 评论 -
数据结构——线性表基本概念
什么是数据结构是数据之间存在一种或多种特定关系的数据元素集合。一个程序简单来说就是数据结构加上算法。数据结构是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。逻辑结构数据之间的相互关系。有 线性表 图 树物理结构/存储结构:数据在计算机中的表示。物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、哈希结构)等一些数据结构线性表(linear list)线性...原创 2021-09-12 16:17:06 · 267 阅读 · 0 评论 -
C++ this指针
背景我们知道一般的类可以声明很多对象,这些对象在调用类的成员函数的时候,怎么区分它们之间的数据成员呢?然后就有了this指针,指向该对象的指针。this指针的概念在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。限制this只能在成员函数中使用成员函数默认第一个参数为T* const register this。(友元函数,全局函数不是成员函数)this指针不能在静态函数中使原创 2021-09-11 22:06:31 · 84 阅读 · 0 评论 -
STL容器——vector
什么是vector?vector(向量)是一个封装了动态大小数组的顺序容器。可以简单的认为,向量是一个能够存放任意类型的动态数组。性质阐述就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存.原创 2021-09-10 22:31:26 · 140 阅读 · 0 评论 -
strncpy和strcpy
strcpy//定义char *strcpy(char *dest, const char *src)//用法 char str3[] = "hellohello";//不能用char* str1,指向常量区后不可改变值 char str4[] = "worldworld"; char str5[] = "world"; cout << strcpy(str3, str4)<<endl; cout << strcpy(str3, s.原创 2021-09-10 18:17:36 · 229 阅读 · 0 评论 -
有符号数与无符号数相加
#include<stdio.h>int main( ){ unsigned int a = 10; int b = -10; (a + b > 0) ? printf(">0") : printf("<=0"); return 0;} //b = -10, b 与无符号数相加会转换成无符号数—— -10 + 2^32 = 4,294,967,286(unsinged int);此时与 a = 10 相加必然大于 1...原创 2021-09-10 10:56:31 · 726 阅读 · 4 评论 -
open() 与 fopen()
什么是open()?open函数属于Linux中系统IO。在Linux下一般用来打开或者创建一个文件,使用open()打开一个文件意味着获得了这个文件的访问句柄。 如果操作成功,它将返回一个文件描述符,如果操作失败,它将返回-1。什么是句柄(file descriptor 简称fd)首先每个文件都属于自己的句柄,例如标准输入是0,标准输出是1,标准出错是2。每打开一个文件就会返回句柄来操作这个文件,一般是从3开始,然后4,5,6一直下去。close(fd) 之后句柄就返回给系统,例...原创 2021-09-09 21:51:01 · 491 阅读 · 0 评论 -
虚函数、虚表和虚指针学习笔记
我们学习之前首先要搞清楚他们之间的定义1. 在一个类里面,用virtual关键字声明的函数叫做虚函数,虚函数首先是是类的成员函数。其中有 纯虚函数:只要是有纯虚函数的类都是抽象类,一般是用来作基类的。class A:{public: virtual void func() = 0}2. 多态性是一个接口多种实现,是面向对象的核心。分为编译多态性和运行多态性。使用虚函数 可以在不同的类中实现函数重写,实现动态多态。class A:{public...原创 2021-09-09 20:23:58 · 236 阅读 · 0 评论 -
Linux编译过程
预编译过程一般是读取 .c 或 .cpp 源程序,对其中的伪指令(以# 开头的指令)和特殊符号进行处理。伪指令有 宏定义,条件编译, 头文件包含指令。特殊符号如 LINE 标识将被解释为当前行号(十进制数),FILE则被解释为当前被编译的C源程序的名称。编译过程编译程序要做的是,通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。不同编译系统会有优化处理。汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。链接过程由汇编原创 2021-09-08 17:35:47 · 241 阅读 · 0 评论 -
变量的声明、定义和初始化
1 定义时系统会为定义的变量分配空间,而声明时,不会分配空间。这个是本质上的区别。2定义在程序中只能出现一次,而声明可以多次。假如在程序的不同位置对变量进行了定义,那么编译器会认为第二个是声明而不是定义。3 变量初始化:就是给变量赋值。定义也是声明,extern声明不是定义。如extern int x,是可以的,但是extern int x = 1;编译就会报错。因为声明是没有分配空间的。声明也就不能初始化。...原创 2021-09-05 16:22:26 · 1942 阅读 · 0 评论 -
什么是内存泄漏和内存溢出
内存泄漏栈由系统操作,程序员不可以操作。所以内存泄漏是指堆内存的泄漏。 堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用。内存溢出你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。内存越界:向系统申请了一块内存,而在使用内存时,超出了申请的..原创 2021-09-02 10:50:46 · 248 阅读 · 0 评论 -
经典的sizeof(struct)和sizeof(union)内存对齐
内存对齐作用:1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某 些地址处取某些特定类型的数据,否则抛出硬件异常。2.性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存, 处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。结构体struct内存对齐的3大规则:1.对于结构体的各个成员,第一个成员的偏移量是0,排列在后面的成员其当前偏移量必须是当前成员类 型的整数倍;2.结构体内所.原创 2021-08-31 17:53:13 · 781 阅读 · 0 评论 -
32位和64位各种数据类型的字节数
数据类型 32位 64位char 1 1short 2 2int 4 4long 4 8float 4 4指针 4 8long long 8 8double 8 8long double 10/12 10/16 有效位10字节,32位.原创 2021-08-31 17:25:12 · 2683 阅读 · 0 评论 -
指针和引用的区别
1 指针有自己的内存空间,引用只是一个别名。2 使用sizeof查看大小,指针是4,引用是被引用对象的大小。3 作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引 用的修改都会改变引用所指向的对象。4可以有const指针,但是没有const引用。5指针可以有多级指针(**p),而引用止于一级。6如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。7 指针可以更改指向,引用不能。...原创 2021-08-24 09:11:33 · 255 阅读 · 0 评论 -
C/C++程序编译的内存分配
1 从静态存储区域分配:内 存 在 程 序 编 译 时 就 已 经 分 配 好 , 这 块 内 存 在 程 序 的 整 个 运 行 期 间 都 存 在 。 速 度 快 、 不 容 易 出 错 , 因 为 有 系 统 会 善 后 。 例 如 全 局 变 量 , s t a t i c 变 量 , 常 量 字 符 串 等 。2 在栈上分配:在 执 行 函 数 时 , 函 数 内 局 部 变 量 的 存 储 单 元 都 在 栈 上 创 建 , 函 数 执 行 结 束 时 这 些 存 储 单 元 自 动原创 2021-08-23 19:17:30 · 661 阅读 · 0 评论 -
全局变量和局部变量
1 全局变量是整个程序都可以访问的变量,生命周期在整个程序从运行到结束。2 局部变量存在于模块之中,作用域一般是函数或者子程序。只有所在作用域可以访问。作用域结束(函数调用完毕),局部变量消失,所占内存也消失。3 从内存分配位置可以知道,全局变量分配在全局数据段,且在程序开始运行的时候被加载,局部变量则分配在堆栈区。...原创 2021-08-23 19:13:54 · 161 阅读 · 0 评论 -
C 语言的 malloc 和 C++ 中的 new 有什么区别
1 new ,delete是操作符,可以重载,只能在C++使用2 malloc,free是函数,可以覆盖,C\C++都可以使用3 new可以调用对象的构造函数,对应的delete可以调用析构函数4 mallo仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数5 new、delete返回的是数据类型指针,而mallo、free返回的是void指针...原创 2021-08-23 19:09:19 · 211 阅读 · 0 评论