欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-11 18:28:41
...

第二章与环境和规则有关,暂时没有值得记录的内容
直接进入第三章《数据》:

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用于修改变量的储存类型,从自动变量改为静态

相关标签: c语言 指针