所以调用这些对象的速度要相对来得低一些。 3、堆栈数据结构区别 堆(数据结构):堆可以被看成是一棵树,如:堆排序。 栈(数据结构):一种先进后出的数据结构。 三、数据结构集中问题 1....以下面的语句为 int *p = &a; *p = 100; 第1行代码中*用来指明 p 是一个指针变量,第2行代码中*用来获取指针指向的数据。 需要注意的是,给指针变量本身赋值时不能加*。...const int * p1 = &i; //p1指向的值不能改变 int * const p2 =&j; //p2本身的值(即指向的值的地址)不能改变 上面定义了两个指针p1和p2。...在定义1中const限定的是*p1,即其指向空间的值不可改变,若改变其指向空间的值如*p1=20,则程序会报错;但p1的值是可以改变的,对p1重新赋值如p1=&k是没有任何问题的。...在定义2中const限定的是指针p2,若改变p2的值如p2=&k,程序将会报错;但*p2,即其所指向的值可以改变,如*p2=80是没有问题的,程序正常执行。 const常量会在内存中分配??
const 修饰变量 用来修饰不可赋值的变量,如果一个变量在声明初始化之后不希望被修改,可以声明为const; const修饰的变量应该进行初始化; const修饰的变量有可能改变,部分编译器可用scanf...用来修饰外部变量(全局),表示该变量在其他文件中定义。首先讲一下声明与定义, 声明不等于定义,声明只是指出了变量的名字,并没有为其分配存储空间;定义指出变量名字同时为变量分配存储空间,定义包含了声明。...内存对齐(结构体内存大小规则) 基础知识 在 C/C++ 中,结构体/类是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构...这种几个类型不同的变量共同占用同一段内存的结构,称为“共用体”类型结构。共用体,也称为联合体。...另外,如果第7行不初始化为NULL,编译时不会报错,但是,它就成了野指针野指针野指针啊,操作野指针是很危险的; 一级指针传递的函数内部更改不影响实参一级指针的值,所以此处要么使用二级指针,要么使用引用。
Good: 右大括号与 else 语句在同一行 ... } // Good: 右大括号独占一行 } 函数声明和定义 规则2.3 函数声明、定义的返回类型和函数名在同一行...;函数参数列表换行时应合理对齐 在声明和定义函数的时候,函数的返回值类型应该和函数名在同一行。...参数列表的左圆括号总是和函数名在同一行,不要单独一行;右圆括号总是跟随最后一个参数。...左大括号被内容跟随时,对应的右大括号也应跟随内容 规则2.11 结构体和联合体在按成员初始化时,每个成员初始化单独一行 C99标准支持结构体和联合体按照成员进行初始化,标准中叫"指定初始化"(designated...建议6.3 函数式宏不超过10行(非空非注释) 函数式宏本身的一大问题是比函数更难以调试和定位,特别是宏过长,调试和定位的难度更大。 而且宏扩展会导致目标代码的膨胀。建议函数式宏不要超过10行。
endl是一个函数模板,这里知道是用来换行的即可。 (注意:C++程序一定是从主函数开始执行的) 良好习惯之规范 一个说明或一个语句占一行,例如:包含头文件、一个可执行语句结束都需要换行。...在使用标识符时还有注意以下几点: 标识符的长度最好不要超过8位,因为在某些版本的C中规定标识符前8位有效,当两个标识符前8位相同时,则被认为是同一个标识符。 标识符是严格区分大小写的。...目前听说但未遇到的用法: 1.有参宏定义 2.宏定义中的特殊操作符 3.宏定义中的多行定义 4.防止重复包含头文件 条件分支结构 1.if分支语句 程序结构...1.函数的参数 1)形参和实参 形参:在定义函数的时候,函数名后面小括号中的参数 , 格式: 数据类型 变量 如:int x; 形参的作用域:只能在本函数中使用 实参:调用函数的时候传递的参数...②地址传递 地址传递与值传递的不同在于,它把实参的存储地址传送给形参,使得形参指针和实参指针指向同一块地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。
段的分类 根据C语言的特点,每一个源程序生成的目标代码将包含源程序所需要表达的所有信息和功能。...在const char a[100]={"ABCDEFG"}中,定义了100个字节的数据区,但是只初始化了前面的8个字节(7个字符和表示结束的'\0')。...只读数据段需要包括程序中定义的const型的数据(如:const char ro[]),还包括程序中需要使用的数据如"123456"。...对于后者,改写成以下的形式,将不允许在程序中修改ptrconst本身的值: const char* const ptrconst = "constant data"; 读写数据段包含了已经初始化的全局变量...栈空间包括函数中内部使用的变量如short b和char a[100],以及char *p1中p1这个变量的值。
这是为C语言本身保留的 对于严格的模块私有函数,使用prv_ name前缀 对于包含下划线_ char的变量/函数/宏/类型,只能使用小写字母 左花括号总是与关键字(for, while, do, switch...abc = 0;/* Wrong */ } 在同一行中声明所有相同类型的局部变量 void my_func(void) { char a; /* OK */...char * get(void); 函数实现必须在单独的行中包含返回类型和可选的其他关键字 /* OK */ int32_t foo(void) { return 0; } /* OK *...当结构用name和typedef声明时,它不能包含t作为基本名称,它必须在它的名称后面包含t后缀作为typedef部分。...将左花括号放在case语句的同一行 switch (a) { /* OK */ case 0: { int32_t a, b; char c;
这是为C语言本身保留的 对于严格的模块私有函数,使用prv_ name前缀 对于包含下划线_ char的变量/函数/宏/类型,只能使用小写字母 左花括号总是与关键字(for, while, do, switch...abc = 0;/* Wrong */ } 在同一行中声明所有相同类型的局部变量 void my_func(void) { char a; /* OK */ char...char * get(void); 函数实现必须在单独的行中包含返回类型和可选的其他关键字 /* OK */ int32_t foo(void) { return 0; } /* OK...当结构用name和typedef声明时,它不能包含t作为基本名称,它必须在它的名称后面包含t后缀作为typedef部分。...将左花括号放在case语句的同一行 switch (a) { /* OK */ case 0: { int32_t a, b; char c;
const和static不可同时修饰类成员函数,const修饰成员函数表示不能修改对象的状态,static修饰成员函数表示该函数属于类,不属于对象,二者相互矛盾。...难记点(我是感觉很SB,除了面试,实际工作中完全没遇到): const char* p = new char(‘a’): 表示p指向的内容不可修改但是p可修改。...引用:是一个别名,还是变量本身。对引用进行的任何操作就是对变量本身进行的操作。 相同点:二者都可以对变量进行修改。 不同点:指针可以不必须初始化,引用必须初始化。...注意:对象不包含虚函数表,只有需指针,类才包含虚函数表,派生类会生成一个兼容基类的虚函数表。 6.常用数据结构 1.vector:向量,连续存储,可随机访问。...QMutex的目的是保护一个对象/数据结构或者代码段在同一时间只有一个线程可以访问。
结构简介 结构是用户定义的类型,而结构声明定义了类型的数据属性。 定义类型之后,就直接创建类型的变量。 结构比数组灵活,同一个结构中可以存储多种类型的数据。...long long_val; double double_val; }; 5.1 结构体和共用体的区别 结构可以同时存储int、long和double。...嵌入式系统编程(如控制烤箱、MP3播放器),内存非常宝贵。 常用于操作系统数据结构或硬件数据结构。...在cout和多数C++表达式中,char数组名、char指针以及用引号括起来的字符串常量都被解释为字符串第一个字符的地址。 不要使用字符串常量或未被初始化的指针来接收输入。...如果标识符是指向结构的指针,则使用箭头运算符(->)。 把new用于结构的两个步骤 创建结构要创建结构,需要同时使用结构类型和new。 创建访问其成员。
在自由存储区中创建的数组对象是没有名字的,只能通过其地址间接地访问堆中的对象。 注意:C++使用new和delete在堆(自由存储区)上分配和释放动态数组。 动态数组初始化: 1....= 1000000; ++ix) { char *pc2 = new char[len]; // pc2指向的存储空间的内容会动态改变,因此不使用const strncpy (pc2...数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针,而且在其失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。...数组的存储格式 多维数组在内存中存储时是按照最低维连续的格式存储的,如二维数组{ {1,2},{3,4}}在内存中的位置是这样顺序的“1,3,2,4”,这跟matlab是有区别的,matlab是按列进行存储的...字符串中每个字符占用一个字节,算上最后的空字符,字符串需要的字节数要比包含的字节数多一个。
没有 const reference,因为引用本身就是 const pointer (为了方便记忆可以想成)被 const 修饰(在 const 后面)的值不可改变,如下文使用例子中的 p2、p3。...在以下场景中,经常需要显式引用 this 指针: 为实现对象的链式引用; 为避免对同一对象进行赋值操作; 在实现一些数据结构时,如 list。...3.7 分割线 可以在一行中用三个以上的减号来建立一个分隔线,同时需要在分隔线的上面空一行。...采用独占式拥有,意味着可以确保一个对象和其相应的资源同一时间只被一个 pointer 拥有。...允许将任何指针转换为任何其他指针类型(如 char* 到 int* 或 One_class* 到 Unrelated_class* 之类的转换,但其本身并不安全) 也允许将任何整数类型转换为任何指针类型以及反向转换
6、const的用法(定义和用途)(必考) const主要用来修饰变量、函数形参和类成员函数: 1)用const修饰常量:定义时就初始化,以后不能更改。...以下几种情况都会用到volatile: 1、并行设备的硬件寄存器(如:状态寄存器) 2、一个中断服务子程序中会访问到的非自动变量 3、多线程应用中被几个任务共享的变量 8、const常量和#define...要是非要使用sizeof来得到指向内容的大小,就得使用数组名才行, 如 char a[10]; sizeof(a):10 //检测到a是一个数组的类型。 ?...结构体struct内存对齐的3大规则: 1.对于结构体的各个成员,第一个成员的偏移量是0,排列在后面的成员其当前偏移量必须是当前成员类型的整数倍; 2.结构体内所有数据成员各自内存对齐后,结构体本身还要进行一次内存对齐...a和c公用同一片内存区域,所以更改c,必然会影响a的数据 #include int main(){ union w { int a; char b;
如果重载函数的目的是为了支持不同数量的同一类型参数, 则优先考虑使用 std::vector 以便使用者可以用 列表初始化 指定参数。...4.4 函数声明与定义 总述 返回类型和函数名在同一行,参数也尽量放在同一行,如果放不下就对形参进行分行,分行方式与函数调用一致。...如果返回类型和函数名在一行放不下, 分行. 如果返回类型与函数声明或定义分行了, 不要缩进. 左圆括号总是和函数名在同一行. 函数名和左圆括号间永远没有空格. 圆括号与参数间没有空格....左大括号总在最后一个参数同一行的末尾处, 不另起新行. 右大括号总是单独位于函数最后一行, 或者与左大括号同一行. 右圆括号和左大括号间总是有一个空格. 所有形参应尽可能对齐....尤其是: 两个函数定义之间的空行不要超过 2 行, 函数体首尾不要留空行, 函数体中也不要随意添加空行. 基本原则是: 同一屏可以显示的代码越多, 越容易理解程序的控制流.
链表(list):即双向链表,除了头节点之外每个节点都会同时指向前一个节点和后一个节点。...为了方便的处理错误信息,QEMU定义了Error和QError两个数据结构。...}; 包含了错误消息字符串和枚举类型的错误类别。...在vl.c中定义如下: 2123 typedef struct QEMUOption { 2124 const char *name; //选项名,如 -device, name的值就是device...两个结构体定义如下: 32 struct QemuOpt { 33 const char *name; //子选项的名字 34 const char *str; //字符串值
普通用法 typedef 复杂用法 extern和包含头文件 const 二维函数和指针 二维数组 char a[5][24] = {0}; printf("%p\r\n", a); printf...函数传了ptr本身的地址0x1进去,在函数内部将它0x1指向的旧地址0x2指向了新的地址如0x3。跳出函数后,ptr本身的地址0x1没变,而它指向的地址变成了0x3。...extern和包含头文件 extern是C语言中的一个关键字,一般用在变量名前或函数名前,作用是用来说明“此变量/函数是在别处定义的,要在此处引用” 使用extern和包含头文件来引用函数的区别: extern...extern, (全局变量在不指定初值时会自动初始化为0) 头文件中包含的都是函数声明,而不是函数定义 最好不要在头文件中定义变量,例如全局变量 const 看const与*的前后关系,并且对于这个声明变量的文字叙述要从赋值号...=前面开始,从右向左逐个翻译,const翻译为常量,*翻译为指针,如const char* name就翻译为name是一个指针,指向char,并且是const,使用汉语的构造句法就是name是一个指向const
命令、选项和源文件之间使用空格分隔一行命令中可以有零个、一个或多个选项文件名可以包含文件的绝对路径,也可以使用相对路径如果命令中不包含输出可执行文件的文件名,可执行文件的文件名会自动生成一个默认名...int,b赋值为10 return 0; } 从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义: int b 它既是声明,同时又是定义对于 extern...同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的。 数组属于构造数据类型: 一个数组可以分解为多个数组元素:这些数组元素可以是基本数据类型或构造类型。 ...在定义数组的同时进行赋值,称为初始化。全局数组若不初始化,编译器将其初始化为零。局部数组若不初始化,内容为随机值。 数组名是一个地址的常量,代表数组中首元素的地址。 ...在内存中并不存在二维数组,二维数组实际的硬件存储器是连续编址的,也就是说内存中只有一维数组,即放完一行之后顺次放入第二行,和一维数组存放方式是一样的。
命令、选项和源文件之间使用空格分隔 一行命令中可以有零个、一个或多个选项 文件名可以包含文件的绝对路径,也可以使用相对路径 如果命令中不包含输出可执行文件的文件名,可执行文件的文件名会自动生成一个默认名...赋值为10 return 0; } 从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义: int b 它既是声明,同时又是定义 对于 extern b来讲它只是声明不是定义...同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的。 数组属于构造数据类型: 一个数组可以分解为多个数组元素:这些数组元素可以是基本数据类型或构造类型。...在定义数组的同时进行赋值,称为初始化。全局数组若不初始化,编译器将其初始化为零。局部数组若不初始化,内容为随机值。 数组名是一个地址的常量,代表数组中首元素的地址。...在内存中并不存在二维数组,二维数组实际的硬件存储器是连续编址的,也就是说内存中只有一维数组,即放完一行之后顺次放入第二行,和一维数组存放方式是一样的。
领取专属 10元无门槛券
手把手带您无忧上云