C/C++语言
文章平均质量分 50
自己根据多年经验编写C语言自学教程
lhh_qrsly
嵌入式领域软件和硬件知识分享
展开
-
C++静态成员函数不能调用非静态成员变量
其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份。然而非静态成员变量和非静态成员函数是针对类的对象而言。然而从本质上来说类的静态成员函数的函数形参中没有默认的this指针,导致不能调用具体实例对象的成员。先在静态成员函数中调用静态成员变量:#include <iostream>using namespace std;class vpoet{public:转载 2022-05-25 11:39:47 · 421 阅读 · 0 评论 -
C++ 测试 DEMO
#include <iostream>#include <memory>#include <atomic>class C{ public: C(); ~C(); int my_temp; void test(); };C::C() :my_temp(0){ printf("C构造函数\n"); }C::~C(){}void C::test(){ printf("C::test\n");原创 2022-05-24 15:58:51 · 363 阅读 · 0 评论 -
C++构造函数和析构函数可以是虚函数吗
1、构造函数不可以是虚函数当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表是一个存储成员函数指针的数据结构。虚函数表是由编译器自动生成与维护的,virtual成员函数会被编译器放入虚函数表中,当存在虚函数时,每个对象都有一个指向虚函数的指针(vptr指针)。在实现多态的过程中,父类和派生类都有vptr指针。vptr的初始化:当对象在创建时,由编译器对vptr指针进行初始化。在定义子类对象时,vptr先指向父类的虚函数表,在父类构造完成之后,子类的vptr才指向自己的虚函数表。如果构造函数转载 2022-05-24 11:05:26 · 275 阅读 · 0 评论 -
C/C++ 获取函数地址
CC语言中没有类的概念,只有普通的函数。通过函数名就可以得到函数地址#include <stdio.h>#include <stdlib.h>void fun() { }int main() { printf("%p\n", &fun);}对于 fun 和 &fun 应该这样理解:fun 是函数的首地址,它的类型是 void ()&fun 表示一个指向函数 fun 这个对象的地址, 它的类型是 void (*)()因此 fun 和转载 2022-05-24 00:08:29 · 7633 阅读 · 2 评论 -
C++何时调用构造函数,何时调用析构函数
在我们创建新的对象的时候,都要执行某一个类中的构造函数,而当构造函数中分配了资源之后,当我们销毁一个对象的时候需要一个相应的操作将这些资源释放出去,这就需要析构函数。一般来说,在有基类和派生类存在时,在创建派生类类型时,会先构造基类,再构造派生类,析构顺序反之,类似于进栈出栈的过程。遇到的情况:指针不会调用构造和析构函数当对指针用new在内存中开辟空间的时候会调用构造函数:当我们使用new为指针开辟空间,然后用delete释放掉空间会调用构造和析构函数当我们函数的形参是一个对象的时候,这时候会系统转载 2022-05-23 23:26:56 · 1547 阅读 · 1 评论 -
C++ 模板数据类型解读
1、std::shared_ptrshared_ptr是一种智能指针(smart pointer),作用有如同指针,但会记录有多少个shared_ptrs共同指向一个对象。这便是所谓的引用计数(reference counting)。一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除。std::condition_variable 是条件变量,更多有关条件变量的定义参考维基百科。Linux 下使用 Pthread 库中的 pthread_cond_*() 函数提供了原创 2022-05-22 12:00:35 · 473 阅读 · 0 评论 -
回调函数的注册和回调
函数注册和回调函数1、什么是函数注册和回调回调函数无非是对函数指针的应用,说白了就是通过使用函数指针来调用一个函数,而函数注册就是把函数指针作为参数传递出去便于别的模块使用的过程。所以函数注册就是为了回调,先注册再回调。2、为什么要使用回调函数回调函数可以把调用者与被调用者分开,所以调用者不关心谁是被调用者以及被调用者如何实现。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用转载 2022-05-19 19:18:16 · 6325 阅读 · 0 评论 -
C语言校验 checksum
因为外界总会对电路存在或多或少的干扰,对于数字信号,很可能导致传输的数据出现千差万别。对于很多需要传输数据的场合,尤其是一些数据可能会影响一些硬件的动作(诸如嵌入式的一些设备、机器人等),错误的数据可能会带来一些隐性风险,想想都可怕。由于本人是嵌入式相关领域的,平时玩的都是单片机,当然单片机的性能千差万别,不过很多的性能都只能说是勉强够用,毕竟成本考虑。所以今天的校验说法,比较简单,但是有效,尤其是一些性能一般的硬件。说道今日主角:累加和校验算法,又名CheckSum算法。至于出处,这里就不考究了。翻译 2022-04-27 16:39:25 · 1693 阅读 · 0 评论 -
队列的简单的队列操作
本文摘抄于《C嵌入式编程设计模式》头文件部分:Queue.h2. #ifndef __QUEUE_H_#define __QUEUE_H_#define QUEUE_SIZE 10/* class queue */typedef struct Queue queue;struct Queue{ int buffer[QUEUE_SIZE]; int head; int size; int tail; int (*isFull)(Queu原创 2020-10-16 21:15:56 · 140 阅读 · 0 评论 -
七、内存管理之循环buf
loopbuf.htypedef struct { unsigned char stat;#define LOOPBUF_STA_ALLOCED 0x01 // 内存是否已经分配#define LOOPBUF_STA_ENDWRIT 0x02 // 写入是否完成 unsigned int size; char *dat; unsigned int原创 2020-09-16 22:21:57 · 432 阅读 · 0 评论 -
七、不同等级的打印功能实现
我们做项目时不同的打印信息可以帮助我们定位代码bug,也可以使代码逻辑清晰#include <stdio.h>#include <tchar.h>#include <stdlib.h>#include < stdarg.h>#define INFO_OUTPUT 3#define WARNING_OUTPUT 2#define DEBUG_OUTPUT 1#define ERROR_OUTPUT 0#defi原创 2020-09-16 15:10:13 · 283 阅读 · 0 评论 -
六、什么是指针,数组,枚举,结构体,共用体,字符串,位域
1、什么是指针?在C语言里面,指针就是就是另一个变量的地址,指针指向这个变量,这个变量可以是函数变量或者整形变量等等。2、什么是数组?数组就是存储一些数据的仓库,只不过这个仓库会定义一定的类型,例如int a[3];这就定义了一个包含三个整型数值的数组。3、什么是枚举?枚举在我们写程序的时候,可以作为常量,作为一些判断的条件,例如enum{int a,int b,int c,int d};这时 a=0;b=1;c=2;d=3;4、什么是结构体?结构体的出现是帮助我们更好的规划我们的代码,让代原创 2020-09-15 23:54:24 · 282 阅读 · 0 评论 -
五、函数的封装 回调函数 - C语言
什么是回调函数?这个我们如果没有了解过会很陌生,简单点说,回调函数就是我们定义的一个函数,只是我们在其他地方调用这个函数的时候,它的执行顺序不是进入回调函数,执行完再返回主掉函数,而是和主调函数相当于同时执行相关功能,当主调函数和回调函数握手后,他们就分开了。#include <stdio.h>#include <tchar.h>#include <stdlib.h>//第一种形式void(*pfun)(int data);void myfun(int da原创 2020-09-15 09:41:06 · 558 阅读 · 0 评论 -
四、基本语法之switch case - C语言
这一讲我们讲解,通过键盘输入数字1,2,或者3,然后我们SWITCH选择打印出来,是对C语言基本语法的练习。#include <stdio.h>#include <tchar.h>#include <stdlib.h>int _tmain(int argc, _TCHAR* argv[]){ int a = 0; printf("键盘输入变量赋值给a\r\n"); scanf("%d",&a); switch (a) { case 1:原创 2020-09-15 09:05:33 · 178 阅读 · 0 评论 -
变量的赋值,运算符的实现
#include <stdio.h>#include <tchar.h>#include <stdlib.h>int _tmain(int argc, _TCHAR* argv[]){ //定义变量 int a = 3; int b = 4; int c = a + b; printf("a = %d,b = %d,c = %d\r\n",a,b,c);//打印 int d =+ a; printf("d = %d\r\n",d);//打印 flo原创 2020-09-14 11:12:58 · 165 阅读 · 0 评论 -
打印十进,十六进制数,打印字符串,进制相互转换
#include <stdio.h>#include <tchar.h>#include <stdlib.h>char *str = "hello word";int _tmain(int argc, _TCHAR* argv[]){ char str_buf[128]; int a = 153;//定义一个变量 printf("a = %d\r\n",a);//打印十进制形式 printf("a = %02x\r\n",a);//打印十六进制形式 p原创 2020-09-14 10:31:46 · 487 阅读 · 0 评论 -
一、定义一个变量为什么要映射为机器码
一、定义一个变量怎么映射位计算机识别的机器码1、变量为什么需要映射为机器码?因为我的计算机只能识别0和1,我们需要把我们定义的变量和最终写的代码,通过编译器编译成计算机识别的编码方式。2、平时我们写代码的变量怎么变成机器码的呢?我们平时写的代码,例如C语言,我们定义了一个变量,int a=23;这个23用10进制表示时我们读23,用十六进制读时就是0X17,用二进制时就是10111,所以最终23=0X17=10111,只是表达编码方式不同而已,但是最终都要转换成计算机识别的二进制形式。...原创 2020-09-14 09:26:16 · 236 阅读 · 0 评论