C语言深度剖析笔记

发布 2021-05-12 01:32:28 阅读 3178

123定义声明最重要的区别:定义创建了对象并为这个对象分配了内存,声明没有分配内存。编译器在缺省的情况下,所有变量都是auto的。

最快的关键字——register:改关键字请求编译器尽可能将变量存在cpu内部寄存器中(而非通过内存寻址访问)以提高效率。只是尽可能而非绝对。

限制:register变量必须是一个单个的值,并且长度应小于或等于整型的长度;而且register变量可能不存放在内存中,所以不能用取值运算符“&”来获取register变量的地址。

4静态变量static:4.1

修饰变量,又分为局部和全局变量,但都在内存的静态区。

4.1.1静态全局变量作用域仅限于变量被定义之处开始,到文件结尾处结束,在定。

义前要使用需加extern。

4.1.2静态局部变量,在函数体内定义,只能在函数里使用,同一文档里其他函数。

也用不了。函数运行结束后,该静态变量的值不会销毁。

修饰函数,函数前添加使函数仅作用于本文件,好处不必担心自己编写的函数与其他文件的函数同名。

5基本数据类型:

32位系统上各类型分配内存大小:short——2byte,int——4byte,long——4byte,float——4byte,double——8byte,char——1byte(具体平台可用sizeof得到)。5.

2变量命名规则:

5.2.1直观且可读,便于建议和阅读。

5.2.2命名应简洁,但尽量标明其专业意义5.

2.3标识名为多个词组成时,每个词首字母大写5.2.

4尽量避免数字编号,除非逻辑开发需要。

5.2.5对在多个文件之间共同使用的全局变量或函数要加范围限定符(使用模块名。

作为范围限定符)

5.2.6习惯上,n、m、i、j、k等表示int类型变量;c、ch表示char变量;a表示。

数组;p表示指针;i、j、k常用语循环变量。5.2.7定义变量的同时要初始化。

sizeof是关键字而非函数。

signed和unsigned关键字:32位signed int类型整数的数值范围为-231~231-1;8位char类型数的值范围为-27~27-1;32位unsigned int类型整数的数值范围为0~232-1;8位char类型数的值范围为0~28-1;默认数据为signed。8

if、else组合8.1

bool变量和“零值”比较的if语句:首先false的值在编译器里定义为0,true则不一定为1;bool btestflag=false相当于if(btestflag);if(!btestflag);8.

2float变量与“零值”比较的if语句:首先不能与0.0进行直接比较;float ftestval=0.

0其if语句应写作:if((ftestval>=-epsinon)&&ftestval<=epsinon));epsinon为定义好的精度。8.

3指针变量与“零值”比较的if语句:int *p=null;定义指针一定要同时初始化;if(null==p);if(null!=p);8.4

if语句注意事项:

8.4.1if语句先处理正常情况,else再处理异常情况;8.4.2确保if和else子句没有弄反;

switch、case组合9.1

注意事项:每个case语句结尾不要忘了使用break,除非有意多分支重叠;最后必须要用default分支,即便不需要default处理,以应该保留default:break;9.

29.3

case语句后面只能是整型或字符型的常量或常量表达式;case语句排序规则:

9.3.1按字母或数字顺序排序case语句有助于查询;

9.3.2正常情况在前,异常在后;9.3.3按执行频率排列;

10do、while、for循环语句。

10.1注意事项:

10.1.1多重循环中,如有可能,应当将最长的循环放在最内层,最短的循环放在最。

外层,以减少cpu跨切循环层的次数。

10.1.2for语句中循环变量尽量采用半开半闭区间写法(即<、>不可在for语句。

中修改循环变量,防止循环失控。

10.1.3循环要尽可能的短,循环嵌套控制在3层以内。

11const修饰只读变量,其值在编译时不可用,作用节省空间,避免不必要的内存分配,同时提高效率。

11.1与宏定义的区别:

#define m 3//宏常量。

const int n=5;//此时并未将n放入内存中……

int i=n;//此时为n分配内存,以后不再分配int i=m;//预编译期间进行宏替换,分配内存int j=n;//不再分配内存。

int j=m;//再进行宏替换,又一次分配内存。

11.2修饰一般变量,可在类型说明符前后添加,int const i=2;或const int i=2;11.3修饰数组11.4修饰指针。

11.5修饰函数的参数:void fun(const int i);告知编译器i在函数体内不能改变11.6修饰函数的返回值。

12extern标示变量或函数的定义在其他文件中13struct结构体:空结构体的大小定为1byte。

13.1c++中struct与class关键字的区别:一般通用,struct的成员默认情况下是public,二class则是private的。

14union共用体:维护足够的空间来放置多个数据成员中的一种,而不是为每一数据成员。

配置空间。15enum枚举关键字,枚举与宏定义的区别:

#define宏常量是在预编译阶段进行简单替换。枚举常量则是在编译的时候确定。

其值。15.2一般在编译器里,可以调试枚举常量,但是不能调试宏常量。

15.3枚举可以一次定义大量相关的常量,二#define宏一次只能定义一个。16typedef关键字:给一个已经存在的数据类型取一个别名。17注释的基本要求:

17.1注释应当准确、易懂,防止有二义性;

17.2边写**边注释,修改**的同时修改相应的注释,保持**与注释的一致性;17.3注释应当简单明了;17.4一目了然的语句不加注释;

17.5对于全局数据(全局变量、常量定义等)必须要添加注释;17.6采用英文避免缩写;

17.7当**比较长且有多重嵌套时,应当在一些段落结束处加注释,便于阅读;17.8注释的缩进要与**缩进一致;17.

9注释应注重why而非how;17.10数值单位一定要注释;17.11对变量范围应给出注释;

17.12对一系列数字编号给出注释,尤其在编写底层驱动程序时(如管脚编号);17.13对函数入口出口数据给出注释。18

19左右移位(<<的位数不能大于数据的长度,不能小于0。20宏定义:

20.1数值宏常量:#definepi3.

141592654#defineerror_poweroff-120.2字符串宏常量:常用于定义路径:

#define path_1 e:/doc20.3用define宏定义表达式时注意括号和空格的使用21撤销宏定义:

#undef22文件包含:#include

#include < filename >表示预处理到系统规定的路径中去获得这个文件(即c编译。

系统所提供的并存放在指定的子目录下的头文件)

#include“filename”表示预处理在当前目录中名为filename的文件,若没有,则按系统指定的路径信息,搜索其他目录。

#line预处理:保证编译过程中,文件名固定,不会被中间文件替代,利于进行分析24#运算符:

#define sqr(x) printf (“the square of x is %d.”, x)*(x)))sqr (8); the square of x is

#define sqr(x) pritnf (“the square of #x is %d.”, x)*(x)))sqr (8); the square of 8 is

##运算符:相当于粘合剂。#define xname(n) x##n26指针在32位系统下占4byte。

xname(8);x8。

27指针数组与数组指针:

27.1指针数组:存储指针的数组,数组占多少字节由数组本身决定。

int *p1[10];27.2数组指针:指向数组的指针,指针大小在32位系统下永远是4byte。

int (*p2)[10];28多维数组:a[i][j]可换算以指针形式为*(*a+i)+j)。

29二级指针:一级指针保存的数据的地址,二级指针保存的是一级指针的地址。**p30一维数组参数。

30.1c语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其。

首元素首地址的指针。

30.2函数是没有类型的,只有函数的返回值才有类型。

31函数指针:可将实现同一功能的多个模块统一起来标识,这样一来更容易后期的维护,系统结构更加清晰。便于分层设计、利于系统抽象、降低耦合度以及接口与实现分开。

31.1(*(void(*)0)()首先void(*)是一个函数指针的类。

型,该函数没有参数没有返回值;其次(void(*)0,这是将0强制转换为函数指针类型,0是一个地址,也就是说一个函数存在首地址为0的一段区域内;再者((void(*)0),这是取0地址开始的一段内存里面的内容,其内容就是保存在首地址为0的一段区域内的函数;最后(*(void(*)0)()就是函数的调用。

32内存管理。

32.1悬垂指针(野指针):内存泄漏。定义指针变量的同时,最好初始化为null,用。

完指针之后也将指针变量的值设置为null。也就是除了在使用时,别的时间都把指针拴在0地址处。32.2静态区、栈和堆。

32.2.1静态区:保存自动全局变量和static变量(包括static全局和局部变量)。静。

态区内容在整个程序的生命周期内存在。

32.2.2栈:保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。特点是效率高,但空间大小有限。

32.2.3堆:由malloc系列函数或new操作符分配的内存。其生命周期由free或。

delete决定。在没有释放之前一直存在,知道程序结束。特点是使用灵活,空间比较大,但容易出错。

32.2.4malloc函数原型:(void*)malloc(int size)。在使用指向这块内存的指针时,6

必须用if(null!=p)语句验证内存确实分配成功。32.2.5free内存释放函数,free完之后一定要给指针置null。

33编码风格。

33.1每一个函数都必须有注释,及时函数短到可能只有几行。

33.2每个函数定义结束之后以及每个文件结束之后都要加一个或若干个空行。33.

3在一个函数体内,变量定义与函数语句之间要加空行。33.4逻辑上密切相关的语句之间不加空行,其他地方应加空行分隔。

33.5复杂的函数中,在分支语句,循环语句结束之后需要适当的注释,方便区分各分。

支或循环体。

33.6修改他人**的时候不要轻易删除别人的**,应该用适当的注释方式。33.

7用缩行显示程序结构,使排版整齐,缩进量统一使用4个字符,不使用tab缩进。33.8在函数体的开始、结构/联合的定义、枚举的定义以及循环、判断等语句中的**。

都要采用缩行。

33.9同层次的**在同层次的缩进层上。

33.10**行最大长度宜控制在80个字符以内,较长的语句、表达式等要分成多行书。

写。33.11长表达式要在低优先级操作符处划分新行,操作符放在新行之首(以便突出操作。

符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。33.12如果函数中的参数过长,则要进行适当的划分。

33.13用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。

33.14如果**行中的运算符较多,用括号确定表达式的操作顺序,避免用默认的优先。

级。33.15不要编写太复杂的复合表达式。33.16不要有多用途的复合表达式。33.17尽量避免含有否定运算的条件表达式。

33.18参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字,如果函数没。

有参数,则用void填充。

34函数设计的一般原则和技巧。

34.1原则上尽量少使用全局变量,因为全局变量生命周期太长易出错,也会长时间占。用空间。

34.2参数名要恰当,顺序要合理。

34.3如果参数是指针,且仅作输入参数使用,则应在类型前加const,以防该指针在函。

数体内被意外修改。

34.4不要省略返回值的类型,如果函数没有返回值,那么应声明为void类型。如没有。

返回值,编译器默认为函数的返回值是int类型。

34.5在函数体的“入口处”,对参数进行有效性检查,尤其是指针参数,尽量使用assert

宏做入口检验,而不使用if语句校验。

34.6return语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动。

销毁。34.7函数的功能要单一,不要设计多用途的函数。34.8函数体的规模要小,尽量控制在80行**之内。

34.9相同的输入应当产生相同的输出,尽量避免函数带有“记忆”功能。34.

10避免函数有太多的参数,参数尽量控制在4个以内。34.11尽量不要使用类型和数目不确定的参数。

34.12有时候函数不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。34.13不仅要检查输入参数的有效性,还有检查通过其他途径进入函数体内的变量有效。

性,例如全局变量、文件句柄。34.14函数名和返回值类型在语义上不可冲突。

35文件内容规则:需要对外空开的常量放在头文件里,不需要对外公开的常量放在定义头。

文件的头部。36文件名命名规则。

36.1文件标识符分为两部分,即文件的前缀和后缀。文件名前缀的最前面使用范围限。

定符——模块名(文件名)缩写;

36.2采用小写字母命名文件,避免使用一些比较通俗的文件名。

C语言深度剖析笔记

1 register声明寄存器变量 2 v olatile可能隐含的被改变,每次使用它时必须从内存中取出。3 sizeof 计算对象所占内存空间大小,是在编译的时候确定声明的两重含义 1这个名字已经匹配到一块内存上去了。2这个名字我先预定义了。switch case 1case后面只能是整型或字符型...

C语言笔记

第一课时。c语言标准格式。include vidomain 以 开头的语句称为预处理指令。include语句不是必须的,但是如果一旦有该语句就必须把它放在文件开始处是standared input output header的缩写standared 标准input 输入output 输出header...

C语言笔记

c语言算法和数据类型。整型。基本类型 字符型注释 基本类型的特点是其不可实型 单精度型以再分解为其他类型双精度型数组型。数据结构 构造型 结构体型共用体型指针型空类型。一 常量。define 语句不以分号结尾,它可以放在源 的任何位置。不过在定义常量时,只有在它定义后的源 中才有效。是一个修饰符,在...