![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
简明C/C++
文章平均质量分 63
毛裤先生_2
这个作者很懒,什么都没留下…
展开
-
宏定义使用技巧
防止一个头文件被重复包含#ifndef MAIN_H#define MAIN_H//头文件包含#endif得到指定地址上的一个字节或字#define MEM_8(x) (*((uint8_t *)(x)))#define MEM_32(x) (*((uint32_t *)(x)))求最大值和最小值#define MAX(x,y) (((x)>(y))?(x):(y))#define MIN(x,y) (((x)<(y))?(x):(y))获取结构体type原创 2021-01-15 15:59:01 · 366 阅读 · 0 评论 -
内存管理
.bss段.bss段用于存放那些没有初始化和初始化为0的全局变量(包括静态变量)。 .bss类型的全局变量只占用运行时的内存空间,而不占用文件空间 当.bss段后面还有其他段时,它就可能占用文件空间,至少镜像文件是这样的 操作系统地下,在加载程序时会把bss段清零 不基于操作系统的裸机程序需要我们自己对bss段进行清零,有时候我们不用清零是因为厂商提供的前面的引导代码帮我们做过了这个操作.data段data段用来存放初始化为非零的全局变量,如果数据初始化为0,为了优化考虑,编译器会把它分配原创 2021-01-14 20:43:41 · 205 阅读 · 0 评论 -
C语言高级用法---container_of()
原文链接:https://blog.csdn.net/rosetta/article/details/90751028在Linux内核源码中,实现和链表相关的接口list_entry()时,会调用container_of()宏定义,它的作用是:给定结构体中某个成员的地址、该结构体类型和该成员的名字获取这个成员所在的结构体变量的首地址。有点绕,没关系,接着往下看就能明白了。container_of()宏定义实现如下所示/** * container_of - cast a member of a转载 2020-10-30 16:35:09 · 314 阅读 · 0 评论 -
C语言高级用法---typeof( ((type *)0)->member )和offset_of()
原文链接:https://blog.csdn.net/rosetta/article/details/90746936前言本文讲解typeof( ((type *)0)->member )的含义,并在此基础上学习offset_of()的用法。typeof( ((type *)0)->member )ANSI C标准允许值为0的常量被强制转换成任何一种类型的指针,并且转换的结果是个NULL,因此((type *)0)的结果就是一个类型为type *的NULL指针.如果利用这个.转载 2020-10-30 16:18:36 · 667 阅读 · 1 评论 -
C语言高级用法---typeof()关键字
原文链接:https://blog.csdn.net/rosetta/article/details/90741468前言typeof()是GUN C提供的一种特性,可参考C-Extensions,它可以取得变量的类型,或者表达式的类型。本文总结了typeof()关键字的常见用法,并给出了相应的例子,以加深理解 。typeof()关键字常见用法typeof()关键字常见用法一共有以下几种。 不用知道函数返回什么类型,可以使用typeof()定义一个用于接收该函数返回值的变量..转载 2020-10-30 16:14:16 · 477 阅读 · 0 评论 -
C++中的类——友元
1、类可以允许其他类、类的成员函数或者外部函数访问它的非公有成员,方法是令其他类或者函数成为它的友元。 1.1、如果类想把一个类或者外部函数作为它的友元,只需要增加一条以friend关键字开始的类或者函数声明语句即可。 1.2、如果想把其他类的成员函数作为它的友元,除了friend关键字外,函数名之前还需要明确指出该成员函数所属的类。(代码见底部)2、友元声明只能出现在类定义的...原创 2018-08-30 08:23:24 · 234 阅读 · 0 评论 -
C++中的const限定符(1)——const的基本用法
使用类型限定符const可以使对象成为常量或者说是只读类型。对于嵌入式开发来说,一般情况下使用const意味着在程序运行时将对象存储在ROM空间从而节省宝贵的RAM空间。1、const对象必须初始化。因为它一旦创建后其值就不能再改变。const对象的初始化分为两种: 1.1、编译时初始化:我们把用这种初始化方式得到的对象或者表达式称为常量表达式。这种方式的到的整型变量典型的可以作为数组...原创 2018-09-05 14:48:51 · 302 阅读 · 0 评论 -
C++中的const限定符(2)——对const的引用
1、可以把引用绑定到const对象上,此时该引用必须是对常量的引用(简称常量引用)。对常量的引用不能被用作修改它所绑定的对象。const int a=5;const int &b=a;2、允许一个常量引用绑定非常量的对象、字面值(非常量引用不行)甚至表达式(非常量引用不行),就连类型都可以不同,只要该表达式的结果能转换成引用的类型即可。double z=3.14;...原创 2018-09-05 17:21:40 · 192 阅读 · 0 评论 -
C++中的类——类的静态成员
一、声明静态成员1、通过在成员的声明之前加上关键字static使得其与类关联在一起。和其他成员一样,静态成员可以是public的或private的。静态数据成员的类型可以是常量、引用、指针、类类型等。二、使用类的静态成员2、类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据,静态数据成员被所有该类型的对象共享。3、静态成员函数也不与任何对象绑定在一起,它们不包...原创 2018-09-03 16:04:20 · 4903 阅读 · 1 评论 -
C++中的const限定符(3)——指针和const
1、指向常量的指针(指针常量):不能用于改变其所指对象的值。const int i=5;const int *p=&i; 分析:这里的const int为数据类型,即声明说明符,*p为声明符表示p是一个指针,所以指针p指向const int型的变量。 1.1、要想存放常量对象的地址,只能使用指针常量。 1.2、允许一个指针常量指向一个非常量对象。和常量引...原创 2018-09-06 08:42:58 · 161 阅读 · 0 评论 -
C++中的const限定符(4)——顶层const和底层const
1、顶层const表示对象本身是常量,这一点对任何数据类型都适用。对于指针,它表示指针本身是一个常量(常量指针)。2、底层const与指针和引用等复合类型的基本类型部分有关。对于指针,它表示指针所指的对象是一个常量(指针常量)。声明引用的const都是底层const。3、当执行拷贝操作时,,常量是顶层const还是底层const区别明显。 3.1、顶层const在拷贝时没有什么限制...原创 2018-09-06 09:20:38 · 163 阅读 · 0 评论 -
C++中的const限定符(5)——const形参和实参
1、当形参有顶层const时,传给它常量对象或非常量对象都是可以的,这一点复合之前所说的,因为形参的初始值是拷贝了实参的。2、在定义重载函数时,需要注意:对于形参是否是const的,是无法被编译器所区分的。void foo(int i){}void foo(const int i){} //无法实现重载3、函数中实参和形参的匹配与...原创 2018-09-15 16:21:56 · 566 阅读 · 0 评论 -
C++11中的constexpr
一、为什么要用constexpr有时我们需要在程序编译时就能得到某个对象或表达式的值,例如定义数组时指定数组大小的值。我们把这种表达式称为常量表达式。字面值属于常亮表达式,用常亮表达式初始化的const对象也是常量表达式。所以我们说一个对象(或表达式)是不是常亮表达式由它的数据类型和初始值共同决定。这里举两个反例:string i="hello"; ...原创 2018-09-01 16:54:13 · 3520 阅读 · 0 评论 -
C++中的类——构造函数
一、什么是构造函数每个类都分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫构造函数。构造函数的任务是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。二、构造函数的定义class 类名{ 访问说明符: 类名(形参列表):初始值列表{函数体定义}};——————————————————...原创 2018-08-29 13:57:31 · 16954 阅读 · 2 评论 -
C++中的迭代器(2)——迭代器运算
1、所有迭代器都支持的运算: 1.1、iter1==iter2&iter1!=iter2 //判断两个迭代器是否相等,如果两个迭代器指示的是同一对象的同一个元素或者它们是同一个容器的尾后迭代器,则相等;反之不相等 这里我们将看到,迭代器并不支持小于、大于等操作。也就是说所有标准库容器的迭代器都定义了==和!=,但都没有定义<等运算符。其次,不是所有的容器...原创 2018-08-21 09:17:58 · 4739 阅读 · 0 评论 -
C++11的auto和decltype的使用
一、auto类型说明符1、auto让编译器通过初始值来推算变量的类型,所以auto定义的变量必须有初始值。int x=0;auto i=x;>>auto=int;2、使用auto可以在一条语句中声明多个变量。因为一条声明语句只能有一个基本数据类型,所以该语句中所有变量的初始值的基本数据类型都必须一样。注意:符号&和*只从属于某个声明符,而非基本数据类型的一...原创 2018-08-11 13:15:59 · 279 阅读 · 0 评论 -
C++中的初始化
这里概括性的讨论了C++中的初始化规则,一些具体类型还需单独讨论。1、当对象在创建时获得了一个特定的值,我们说这个对象被初始化了。用于初始化变量的值可以是任意复杂的表达式。2、初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,以一个新值来代替。3、初始化可分为直接初始化和拷贝初始化: 3.1、若使用=初始化一个变量,则执行的是拷贝初始化...原创 2018-08-13 11:14:33 · 305 阅读 · 0 评论 -
C++中的string对象(2)——string对象上的操作
1、可以使用IO操作符读写string对象。 1.1、读写单个string对象: string i; cin>>i;//string对象会自动忽略开头的空白并从第一个真正的字符开始读起,直到遇见下一处空白为止 cout<<i; <键盘输入:" hello world! ...原创 2018-08-15 14:10:46 · 1101 阅读 · 0 评论 -
C++中的string对象(1)——string对象的初始化
1、标准库类型string表示可变长的字符序列,使用时需包含string头文件。 #include <string>2、作为标准库的一部分,string定义在命名空间std中。 using std::string;3、如何初始化类的对象是由类本身决定的,一个类可以定义很多种初始化对象的方式,只不过这些方式之间必须有所区别:或者是初始值的数量不同,或者是类型不同。...原创 2018-08-13 14:31:13 · 2276 阅读 · 0 评论 -
C++中的string对象(3)——处理string对象中的字符
1、(C++11)基于范围的for语句:for(定义一个变量用于访问序列中的基础元素:表示一个序列的对象) string s("hello");//string对象表示一个字符的序列 for(auto c:s)//每次迭代,c被初始化为s中的下一个字符 //要执行的操作2、(C++11)上述操作只能用于读取string对象,如果想要改变string对象中字符的值,则...原创 2018-08-16 09:29:47 · 1126 阅读 · 0 评论 -
C++与C标准库头文件
C++标准库中除了定义C++语言特有的功能外,也兼容了C语言的标准库。C语言的头文件形如name.h,C++则将这些文件命名为cname,这里的c表示这是一个属于C语言标准库的头文件。因此cname和name.h头文件中的内容是一样的,不同之处在于:cname的头文件中定义的名字从属于命名空间std,而名为name.h的头文件中则不然。一般来说,C++程序应该是有命名为cname的头文件,标准...原创 2018-08-16 09:43:05 · 1078 阅读 · 0 评论 -
C++中的vector对象(1)——vector对象的初始化
1、标准库类型vector表示对象的集合,其中所有对象的类型必须相同。因为vector容纳着“容纳着”其他对象,所以也常被称作容器。2、想要使用vector必须包含适当的头文件。 #include <vector> using std::vector;//其定义在命名空间std中3、vector是一个类模板。当使用模板实例化类时,需要提供额外的信息来指定编译...原创 2018-08-17 08:41:46 · 9515 阅读 · 1 评论 -
C++中的vector对象(2)——vector对象的操作
1、不能使用IO操作符读取或者输出vector对象。2.可以使用范围for语句访问vector对象中的每个元素。同样有时为了改变其中的元素,我们需要将循环变量定义成引用类型。3、vector的成员函数push_back用于向vector对象的末尾添加一个值。 vector<int> i; i.push_back(0); 注意:如果循环体内部包含有向v...原创 2018-08-20 09:18:54 · 1803 阅读 · 0 评论 -
C语言中的位域
struct 位域结构名{ 位域类型 位域名:占用位的长度;(位域列表)};1、使用位域可能不如使用位运算符的执行速度快,但是位域使程序更容易阅读。2、如果某个作用域中定义了位域结构,则在该作用域中就不能使用typedef或#define来定义与位域结构名相同的类型名。3、在之前的标准中,位域类型必须是int、unsigned int或signed int。使用in...原创 2018-08-27 14:45:42 · 1040 阅读 · 0 评论 -
C++中的类——类的定义和声明
面向对象最大的特征就是提出了类和对象的概念。在以面向对象的方式开发应用程序时,将遇到的各种事物抽象为类,类中通常包含数据和操作数据的方法,用户通过实例化类对象来访问类中的数据和方法。一、类的定义class/struct 类名 //类头{数据和方法的定义(可能含有类型成员)}; //类体1、使用class和struct的...原创 2018-08-23 10:49:04 · 77175 阅读 · 2 评论 -
C++中的类——this指针
一、什么是this指针1、在类的方法内部可以使用this指针指向当前调用的对象。二、this指针的属性及其实现方法2、this是一个常亮指针,不允许改变this中保存的地址。3、事实上,编译器为了实现this指针,会在成员函数的参数中自动添加一个this指针,并在函数调用时将对象自身的地址隐含作为实参传递给this。这样可以方便的用于对不同对象的数据成员或方法进行访问。 详...原创 2018-08-28 10:45:05 · 944 阅读 · 0 评论 -
C++中的迭代器(1)——初识迭代器
1、所有标准库容器都可以使用迭代器,但只有少数几种才同时支持下标运算符。2、string对象不属于容器类型,但string支持很多与容器类型类似的操作,故string对象也支持迭代器。3、迭代器与指针类型非常相似,也提供了对对象的间接访问。 使用迭代器可以访问某个元素,也可以从一个元素移动到另一个元素。 迭代器有有效和无效之分,有效的迭代器或者指向某个元素,或者指向容器中尾...原创 2018-08-21 08:46:51 · 428 阅读 · 0 评论 -
C/C++语言中的声明
一般的声明形式如下:声明说明符+声明符列表声明说明符:描述声明的变量或函数的性质。 声明说明符分为三大类: 1.存储类型:auto、static、extern、register。每次声明只能出现一个存储类型,并且放在声明语句的最前面。 2.类型限定符:const、volatile、(:C99restrict)。每次声明可以包含零个或多个...原创 2018-08-11 13:12:56 · 1391 阅读 · 0 评论