转载请注明出处:http://blog.csdn.net/east5683/article/details/22228557
本学习笔记来自于阅读陈正冲老师编著的《C语言深度剖析》。
1,sizeof是C语言中的关键字,我们经常使用其计算变量或类型所占空间大小,在计算变量或常量所占空间大小时,括号可以省略(eg:int i=0;sizeof(i)或sizeof i都是可行的),而计算数据类型大小时不能省略(sizeof(int)不能写为sizeof int)。
2,下面的for循环是个死循环,因为unsigned int范围是0~2^32-1,当i==0后i--得到的并不是预期的-1而是
2^32-1。
unsigned int i;
for(i=9;i>=0;i--)
{
printf("%u,",i);
}
3,C语言中的注释会被空格替换掉,eg int/*…*/i;等同于int i;是合法的,而in/*…*/t i;则等同于in t i;是非法的。
反斜杠”\”不仅可用作转义符而且还可用作续行符,用作续行符时在本行其后面不能再有任何字符(包括空格)。
左移和右移的位数不能大于数据的长度,也不能小于0。
4,printf函数有返回值,返回输出字符的个数。逗号运算符运算级别是最低的,逗号表达式的值是从左向右依此
计算每个表达式的值,最右边的表达式的值就是整个逗号表达式的值。下面的for循环是死循环:
for(i=0,printf(“first=%d”,i);i<10,printf(“second=%d”,i);i++,printf(“third=%d”,i))
{
printf(“fourth=%d”,i);
}
5,结构体默认的内存对齐方式是它的所有成员使用的对齐参数中最大的一个,结构体成员按其类型的对齐参数(通
常是这个类型的大小)和指定对齐参数(#pragma pack(n)中的n)中较小的一个对齐,并且结构体的长度必须为所用
过的所有对齐参数的整数倍,不够就补空字节。
6,#define SQR(x) printf("The square of "#x" is %d.\n",((x)*(x)));效果和
#define SQR(x) printf("The square of %d is%d.\n",(x), ((x)*(x)));相同,记住#x需要放入双引号""里面。
7, ##预算符把两个语言符号组合成单个语言符号,如#define XNAME(n) x##n则XNAME(8)则会被展开为x8,也就是
说##就是个粘合剂,将前后两部分粘合起来。若##前后有空格则空格将会被省略掉。(此用法在android和
chrome系统源码中很常见)。
8,简单的可以理解内存分为三个部分:静态区、栈(也称堆栈)、堆。
静态区:保存自动全局变量和static变量(包括static全局和局部变量),静态区的内容在总个程序的生命周期内都存
在,由编译器在编译的时候分配。
栈:保存局部变量,栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁,特点是
效率高,但空间大小有限。
堆:由malloc系列函数或new操作符分配的内存,其生命周期由free或delete决定,在没有释放之前一直存在,
直到程序结束,特点是使用灵活,空间比较大,但容易出错。