C 语言深度解剖 读书笔记

来源:互联网 发布:Js里面获取属性 编辑:程序博客网 时间:2024/04/28 21:02

工作还是要找滴,书还是要看滴。最近一个星期没事儿的时候翻翻,把这个书给看了。现在做个读书笔记,总结点东西!C语言..

 

 

register关键字

    告诉编译器尽量把我往寄存器里面塞,但大部分是事与愿违,寄存器太小啊。而且,你变量的大小受寄存器bit位限制!而且即使你成功挤入,又会出现个让人上火的问题:无法通过&取地址。所以,我分析:偶尔上线,仅供欣赏!

 

static功能总结

static修饰的变量只在当前文件中可用,无法在其他文件中被extern引用;

被存储在内存的静态区,生命周期在其作用域中不会终结,除非程序结束;

同样可以修饰函数;

【在C++中还有另一层意思:静态成员】

 

unsigned与signed

 

逻辑判断与零值比较
bool : if ( bFlagLive && !bFlagDie )
float : if ( (fVal < -EPS) && (fVal > EPS) )  //EPS为精度
ptr : if( NULL == ptr )   //常量放在 == 前面是个避免不必要bug的好习惯呀

 

const修饰

const修饰的变量在C中仍被认为是只读变量,而在C++中则为只读常量:值不会被改变。

而常量与变量的一个区别是,编译阶段可不可以使用,例如在对数组的初始化、作为case后的值~ 因为有了常量的头衔都变得可以实现(C++)。但是,意义在哪里呢?摒弃#define? 好吧。。

C++中的Const用法更复杂,详细的见总结:http://wenku.baidu.com/view/346868d149649b6648d747ea.html

 

void*

void类型的指针,可以被当作任意类型的指针的左值!用处很大~

 

被遗忘的volatile

简单的说,它也是个类型修饰符,表示被修饰者的值随时有可能被外星人在其他位置篡改,别老用缓存里的数据啦,每次其作为右值的时候你就老实到内存里去重新load吧。
恩 类似写寄存器变量、信号量、共享数据以及多线程多核处理器编程的时候,会经常用到的吧。

 

#pragma pack(n)及struct的大小

可以定义编译器的内存对齐方式,直接的影响是对结构体的大小判断上。每个成员按其类型的对齐参数(类型大小)和指定对齐参数中较小的一个对齐,并且结构的总长度必须为所用过所有对齐参数的整数倍!不够则补空字节。

 

union大小端对其的影响及判断系统大小端方法

上面的代码可以判断系统是大端还是小端。如果返回1,说明是小端模式,如果返回0则说明其系统是大端模式。主要就是看1被存储在高字节还是低字节咯。

 

#define 宏定义

先记住:是预编译的时候直接代码替代!所以系统中会有多个宏定义副本,开销较大。

 

数组和指针纠结

指针定义后应初始化或者NULL;

C语言中,一维数组作为实参传递给函数的形参,不管形参是指针类型还是数组类型,都会把实参解析成一个指向其首元素首地址的指针!

地址的强制转化:

在对指针进行+1,-1操作的时候,一定要先弄清楚这个指针的类型,然后你加减的大小要乘以这个指针类型的大小!!!!

 

函数指针

 

内存管理

内存区分为:堆、栈和静态区;

堆上的内存被new(malloc)分配后,除非手动delete(free),否则一直存在,只到程序结束。堆上空间较大,但容易出错(内存泄漏);

栈上的内存保存局部变量,函数或作用域结束则自动释放其中定义的栈上空间,效率高,但空间大小有限,生命周期短;

静态区保存自动全局变量和static变量,编译的时候分配内存,在整个程序生命周期内都存在!

常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)

assert(NULL!=p)应该经常用,在函数的入口处就用;

给指针p new一个内存之后就应该先判断p是不是为NULL再继续用(堆上可能没有空间了)

delete必须对之前new过的而且还没有delete过的指针使用,delete过后应该将指针p赋值为NULL!!!

 

 

 

原创粉丝点击