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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值