c和指针(pointers on c)第二,三章《数据》学习记录

第二章为基本概率,所以直接进入第三章《数据》:

1.字符声明的两面性

我们在申明变量类型时,若未显性申明signed or unsigned,此时不同的编译器会自动申明为不同的类型。
若我们显性声明signed char or signed int 可以提高程序的可移植性,确保不同机器处理时,保证相同的效果。
但反之,不用的机器在处理signed 和unsigned的效率不同,若硬性申明,效率可能会受损,甚至可能有数据兼容性问题。
因此有时未必是上策

2.关于const关键字

在声明变量时,如果变量的值不会改变,也可以使用改关键字,让你的意图在其他阅读改程序时更清晰的展现,且当这个值意外被改变时,编译器能够发现这个问题。所以 const 并非只是特定的去限定变量

3.链接属性

链接属性分为external(外部),internal(内部)和none(无)
external: 无论声明多少次,位于几个源文件都属于同一个实体。
internal: 在同一源文件中所有声明指向同一实体,但位于不同源文件的多个声明则属于不同实体。
none:完全独立的个体
在未定义(缺省)的情况下,原型作用域(prototype scope)和代码块的变量之外的均为external,还有在代码块内但为函数名的变量也是external
例如:

tpedef char*a
int b;
int c(int d)
{
	int e;
	int f(int g);
}

其中 b,c,f均为external,a属于文件内定义的变量肯定不是external
当我们需要internal属性时,直接加上关键字static即可。
当使用extern来对标识符第一次声明时,它指定该标识符具有external链接属性,但是当它用于第二次及以后的声明时,它不会改变第一次声明指定的链接属性(即后面使用关键字static时,链接依然是external)

4.储存类型

一共有三个地方可以储存变量:普通内存,运行时堆栈,硬件寄存器。
1.静态变量
任何在代码块之外的声明变量总是储存于静态内存中,即不属于堆栈的内存,称为静态(static)变量。这类变量在程序整个执行期间一直存在。
2. 自动变量
代码块中内部声明的缺省变量是自动变量,储存于堆栈中,关键词auto用于表示该变量。自动变量在代码块执行时产生,结束时销毁。当代码块被重复执行时,与原来变量储存的位置不一定相同。
3.register(寄存器)
register可以用来申明自动变量,让数据储存于寄存器访问起来效率更高。但是当register申明过多时,编译器不一定会理睬该关键字,只会选取几个实际储存与寄存器中,其余的正常处理,甚至编译器会有自己的寄存器优化方法

5.static关键词

static关键词在不同的环境下会产生不同的效果,因此在这里总结一下
1.当用于函数定义时,或代码块之外的变量声明时,static用于修改链接属性,从external改为internal。但储存类型和作用域不受改变。
2.当用于代码块内部的变量声明时,static用于修改变量的储存类型,从自动变量改为静态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值