[转]读书笔记《c语言深度解剖》(1)

来源:互联网 发布:淘宝开店的押金怎么退 编辑:程序博客网 时间:2024/04/28 01:37

从昨天开始看《c语言深度解剖》,打算做一个读书笔记,把看到的知识,不管是掌握的还是没掌握的都记录下来,以便以后复习。
第一章:关键字
1.定义和声明
定义:编译器创建一个对象,为这个对象分配一块内存并给它取上一个名字。
声明:声明有两重含义。第一,告诉编译器,这个名字已经被匹配到一块内存上面了,下面的代码用到的变量是再别的地方定义的。声明可以出现多次。第二,告诉编译器,这个名字先预定了,别的地方不能拿它做变量名和对象名,这种声明最典型的例子是函数参数的声明。例如:void func(int i, char c)
所以,定义和声明最重要的区别是,定义创建了对象并且分配了内存,声明没有分配内存。
2.寄存器(先不考虑cpu高速缓存区)
cpu是不直接和内存打交道的,数据从内存里面拿出来,先放到寄存器,然后cpu再通过寄存器读取数据进行计算,之后再把数据通过寄存器放到内存里面。一个cpu可能有很多寄存器。
3.register关键字
尽可能的把变量放入寄存器中,以提高访问速度。但是变量必须是cpu寄存器所能接受的类型,意味着register变量必须是一个单个的值,而且长度必须小于等于整型的长度。
4.static关键字
在c语言中,static有两个作用,修饰变量和修饰函数。
修饰变量:包括修饰局部变量和全局变量,它们都分布在内存的静态区域。静态全局变量,作用域限定为从当前定义处开始,到该文件结束。在其他文件中用extern也无法使用,想要在当前文件定义之前使用就得加extern。静态局部变量,只能在定义它函数体中使用。函数运行结束,该变量也不会销毁,下一次运行函数仍然能用到这个值。
有一个小的程序:view plaincopy to clipboardprint?
static int j;  
void func_1() {  
    static int i = 0;  
    ++i;  
}  
void func_2() {  
    j = 0;  
    ++j;  
}  
int main() {  
    int k;  
    for(k=0; k<10; ++k) {  
        func_1();  
        func_2();  
    }  
    return 0;  

static int j;
void func_1() {
    static int i = 0;
    ++i;
}
void func_2() {
    j = 0;
    ++j;
}
int main() {
    int k;
    for(k=0; k<10; ++k) {
        func_1();
        func_2();
    }
    return 0;
} 运行的结果是i等于10,j等于1.
因为i是静态局部变量,只初始化一次。所以每次func_1中的第一条语句可以看做是无效的,这样i就被加了10次。而j在每次func_2执行的开始,都被赋值为0,所以最后j的值为1.
另外此处涉及到了全局变量和局部变量,局部变量在每次函数调用的时候分配空间,在函数调用结束之后销毁。全局变量在程序开始运行时分配空间,在程序结束时销毁。如果局部变量和全局变量重名,局部变量会暂时覆盖掉全局变量。另外,全局变量只能用常量表达式初始化,因为程序开始运行时要用适当的值来初始化全局变量,所以初始值必须保存在编译生成的可执行文件中,因此初始值在编译时要计算出来。
c语言从语法上规定,全局变量只能用常量表达式初始化。
比如两个全局变量:
int a = 1;
int b = a + 1;
虽然a的值在编译的时候能够计算出来,但是a+1不是常量表达式,不符合语法规定。
再另外,全局变量不初始化,则初始值是0,局部变量不初始化,初始值不确定。切记。
static 还可以修饰函数,表示该函数只能在本文件中使用。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jiangyi711/archive/2010/01/26/5257672.aspx

 

原创粉丝点击