1.C语言是一种底层语言,提供了对机器级概念(例如,字节和地址)的访问,这些是其他语言试图隐藏的内容。C语言提供了与计算机内置指令紧密协调的操作,使得程序可以快速执行。
2.内存泄漏工具帮助定位“内存泄漏”,即那些动态分配但从未被释放的内存块。
3.把程序转化为机器可以执行的形式:预处理->编译->链接。
预处理器执行以#开头的命令(通常称为指令)。
编译器会把程序翻译成机器指令(即目标代码)。
链接器把编译器产生的目标代码和所需的其他附加代码整合在一起,最终产生了完全可执行的程序。
4.编译C程序之前,预处理器会首先对其进行编辑。预处理器执行的命令称为指令。
5.当宏包含了运算符时,必须用括号把表达式括起来。
6.while(getchar()!='\n')用来跳过输入行的剩余部分。
7.最好尽量避免使用无符号整数,特别是不要把它和有符号整数混合使用。
8.typedef比#define功能更强大。typedef命名的对象具有和变量相同的作用域规则;定义在函数体内的typedef名字在函数体外是无法识别的。
9.快速排序:

void quicksort(int a[],int low,int high){
    int middle;
    if(low>=high)return;
    middle = split(a,low,high);
    quicksort(a,low,middle-1);
    quicksort(a,middle+1,high);
}
int split(int a[],int low,int high){
    int part_element = a[low];
    for(;;){
        while(low<high && part_element<=a[high])
            high--;
        if(low>=high)break;
        a[low++] = a[high];

        while(low<high && a[low]<=part_element)
            low++;
        if(low>=high)break;
        a[high--] = a[low];
    }
    a[high] = part_element;
    return high;
}

10.外部变量(有时称为全局变量),从变量被声明的点开始一直到所在文件的末尾。
11.具有静态存储期限的局部变量会对递归函数产生什么影响?
当函数是递归函数时,每次调用它都会产生其自动变量的新副本。静态变量就不会发生这样的情况,相反,所有的函数调用都共享同一个静态变
量。
12.&-取地址运算符,间接寻址运算符。
13.不要把间接寻址运算符用于未初始化的指针变量。
14.const int *p --不能改变指针p指向的整数 *p=0; wrong!
int * const p--不能改变p本身的值 p=&j; wrong!
15.对于任意数组a来说,表达式a[i]等价于
(a+i)。因此&a[i][0]等同于&(a[i]+0)),而后者等同于&a[i]。
16.(p)[NUM_COLS]中,p是需要使用括号的;如果没有括号,编译器将认为p是指针数组,而不是指向数组的指针。
17.将二维数组a声明为变长数组:
int a[m][n];
int (p)[n];
for(p=a;p<a+m;p++)
(
p)[i]=0;
18.gets函数天生就是不安全的,fgets函数是更好的选择。
19.#运算符将宏的一个参数转变为字符串字面量。
20.条件编译使我们可以检测一个宏当前是否已经被定义了,如果没有,则提供一个默认的定义。
21.在用于表达式时,数组“衰退”成指针。但在变量声明中,数组和指针是截然不同的两种类型。
22.记住:在编程后期再结构化数据。
23.getchar()函数实际上返回的是int类型值而不是char类型值。当不能继续读入时(通常因为读到了输入文件的末尾),getchar()的返回值为EOF。
24.结构体变量和联合变量只有一处不同:结构体成员存储在不同的内存地址中,而联合变量成员存储在同一内存地址中。改变联合变量的一个成员就会使之前存储在任何其他成员中的值发生改变。
25.库是一个相关函数的集合。例如<string.h>头就是字符串处理函数的接口。
26.memset函数会将一个字符的多个副本存储到指定的内存区域。一个用途是将数组全部初始化为0:
memset(a,0,sizeof(a));
27.assert有一个参数,这个参数必须是一种“断言”--一个我们认为正常情况下一定为真的表达式。每次执行assert时,它都会检查其参数的值,如果参数的值不为0,assert什么也不做;如果参数的值为0,assert会指向stderr写一条消息,并调用abort函数终止程序执行。