C/C++
文章平均质量分 78
C++语言相关技术记录
yelvens
我很懒,什么都没留下…
展开
-
C/C++获取struct结构体成员的偏移值
可以使用结构体成员的地址减去结构体对象的地址。二、没有结构体对象2.1 使用 0 地址将0强制转换为结构体类型的指针,获取每个成员的地址值,该地址值就是成员的偏移值。,编译器会将当作是一个结构体对象的地址,所以很容易推出成员的偏移值。这种方式在GDB调试core文件时,获取某个结构体成员的偏移值会很方便。2.2 使用offsetof函数标准库中定义了函数offsetof(type,member),该函数是一个宏定义,第一个参数是结构体的类型,第二个参数是所求的成员名。...原创 2022-06-27 13:18:05 · 1472 阅读 · 0 评论 -
C++ STL(一)容器总结
文章目录一、容器库概述1.1 迭代器1.2 容器类型别名1.3 容器的定义与初始化1.4 赋值和swap二、顺序容器1.1 顺序容器的类型1.2 确定使用哪种容器1.3 容器的定义与初始化1.4 容器基本操作二、关联容器三、容器适配器四、容器总结一、容器库概述1.1 迭代器所有标准库容器都可以使用迭代器,但是只有少数几种支持下标运算符(vector、deque、map)。有效迭代器指向容器中的某个元素,或者指向容器中尾元素的下一个位置,后者成为尾后迭代器,其余都是无效的。迭代器运算符使用==和!=原创 2021-07-25 23:55:06 · 609 阅读 · 4 评论 -
C/C++使用0元素数组实现可变结构体
文章目录一、结构体在内存中的布局1.1 内存对齐二、0元素数组三、使用0元素数组实现可变结构体一、结构体在内存中的布局结构体只是一个数据的集合,结构体地址也只是第一个元素的地址,如果各个元素没有内存对齐的限制,它们的则会依次挨着存放在内存中,也就不会存在填充字节。1.1 内存对齐假设现有环境是一个32位的机器,则字长为4个字节,内存结构如下图所示:有一个结构体A:struct A { short a; bool b; int c;};先不考虑内存对齐,将a、b、c存放到内存中,则a原创 2021-07-04 21:27:52 · 922 阅读 · 2 评论 -
C/C++实现int、long、double以及含有字符串的结构体与字节数组之间的相互转换
文章目录一、对象地址与排列方式二、int、long、double类型与字节数组的转换三、含有字符串的结构体与字节数组的转换四、测试及其结果一、对象地址与排列方式我们首先需要明白,对于跨越多字节的程序对象,我们必须建立两个规则:1)对象的地址是什么?在几乎所有的机器上,多字节对象都被存储为连续的字节序列,如int类型对象为四个字节序列,对象的地址为所使用的字节中的最小的地址。2)如何排列这些字节?(大端法、小端法)大端法:在内存中按照从最高有效字节到最低有效字节的顺序存储对象,最高有效字节在前面原创 2021-04-07 20:05:45 · 958 阅读 · 0 评论 -
C/C++字符串归纳整理
文章目录一、C风格的字符串二、标准库类型string2.1 定义和初始化string对象2.2 string对象上的操作2.3 处理string对象中的字符三、额外的string操作一、C风格的字符串C风格的字符串不是一种类型,而是为了表达和使用字符串而约定成俗的一种写法,按此写法字符串是以空字符('\0')结尾的字符数组,一般利用指针来操作这些字符串。下面是一些C标准的String函数,位于头文件<cstring>中,传入此类函数的指针必须是以空字符作为结束的数组,且这些函数不负责验证传原创 2021-03-18 09:22:08 · 658 阅读 · 0 评论 -
C/C++数组归纳整理
文章目录一、定义和初始化数组1.1 声明数组:1.2 显示初始化数组1.3 字符数组的特殊性1.4 复杂的数组声明1.5 访问数组元素二、指针和数组2.1 指针和数组操作的几个规则2.2 区分数组中几个表达式的含义三、、多维数组一、定义和初始化数组1.1 声明数组:type arrayName [ arraySize ];arraySize是常量表达式,一般叫维度值。数组的元素必须为对象,且每个元素的类型都一致。1.2 显示初始化数组可以通过列表初始化,也可以先声明一个数组,在分别初始化原创 2021-03-02 17:31:15 · 436 阅读 · 0 评论 -
C/C++函数归纳整理(一)
文章目录一、参数传递1.1 值传递1.2 引用传递1.3 指针或引用形参与const1.4 数组形参二、返回值正在补充中。。。。。。。。。。。。。。。一、参数传递1.1 值传递值传递过程中,被调函数的形参作为被调函数的局部变量处理,会在栈中开辟内存空间以存放由主调函数传递进来的实参值,从而形成了实参的一个副本。值传递的特点是,被调函数对形参的任何操作都是作为局部变量进行的,不会影响主调函数的实参变量的值。指针参数传递本质上是值传递,它所传递的是一个地址值,将实参指针的值传递给了形参指针,所以形原创 2021-02-01 09:19:33 · 292 阅读 · 0 评论 -
C/C++引用与指针基础及进阶使用详解
一、引用引用类型同指针类型一样,属于C++的一种复合类型。引用也就是为对象起了一个别名,引用类型引用另外一种类型,而非引用类型。引用的定义:一般在初始化变量时,初始值会被拷贝到新建的对象中。而在定义引用时,程序把引用和它的初始值绑定到一起,而不是将值拷贝给引用。一旦初始化完成,引用将和它的初始值永远绑定在一起,不能再重新绑定到另一个对象,所以定义引用一定要初始化,且初始值为对象。 int ival = 1024; int& refVal = ival, ival2 = 110;//refV原创 2020-11-12 10:06:50 · 1245 阅读 · 2 评论 -
C++中malloc、free函数和new、delete运算符
C++内存结构从低地址到高地址依次可分为:代码区(只读区) - 全局区(静态区) - 堆区 - 栈区。代码区存放编译后的二进制代码;全局区存放程序执行时的全局变量和静态数据;堆区用于存放程序执行时动态分配的内存段;栈区当前执行函数的信息。程序执行内存分配的三种方式(编译代码不分配内存,只是一个难搞的翻译过程而已,执行的时候才分配):1)从静态存储区域分配。2)在栈上创建。3)从堆上分配,亦称动态内存分配。下面的内容都在对上操作动态分配内存。如果完全不知道这些内容可以看这里:https://blo原创 2020-08-19 19:15:03 · 586 阅读 · 0 评论 -
C/C++程序编译后运行时的内存分配
文章转自于:http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html一、编译时与运行时的内存情况1.编译时不分配内存编译时是不分配内存的。此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确。所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误。2.运行时必分配内存运行时程序是必须调到“内存”的。因为CPU(其中有多个寄存器)只与内存打交道的。程序在进入实际内存之前要首先分配物理内存。3.编译过程只能简单说一下,因为如果.转载 2020-07-26 20:45:10 · 2959 阅读 · 0 评论 -
C/C++程序的编译链接过程详解
编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-->可执行文件1.编译预处理读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理, 伪指令主要包括以下四个方面(1)宏定义指令,如#define Name To转载 2020-08-15 15:08:16 · 1667 阅读 · 0 评论 -
C/C++复杂声明(函数类型和函数指针)
C++复杂声明也就是函数类型的声明,函数类型可以理解为是一个只包括了返回类型和参数类型的函数签名,以下面函数为例:int max(int a, int b){ ...}该函数的类型是:int(int, int),类比于基本类型就是int、double等。基本类型指针的形式是:int*、double*,函数类型指针(函数指针)的形式是:int(*)(int, int),在返回类型和参数列表之间加一个*并用()括起来。如果要一次定义两个整型指针,int* a, b;这么做肯定是错的,后面的b是一个普原创 2020-08-15 11:38:42 · 1568 阅读 · 1 评论 -
C++中const关键字的作用
下面转载的内容只是一个总结,如果不知道const关键字的用法,建议先看这个:https://www.runoob.com/w3cnote/cpp-const-keyword.html原文链接:https://blog.csdn.net/ypshowm/article/details/89030156 const关键字的作用(1)作用转载 2020-08-07 10:52:56 · 746 阅读 · 1 评论