第二章主要是阐述了C语言的环境:编译和执行。
在编译中基本上编译器分为4部分动作:
1.由预处理器进行处理,执行一些文本操作,#define以及#include这些动作
2.编译,-s把代码翻译成汇编语言
3.汇编,把汇编语言翻译成二进制文件,也就是各个目标代码
4.链接,最后把目标代码捆绑在一起,同时引入标准库的函数程序。
第三章主要是通过数据来描述各个类型:
1.为了保持可移植性,把char限定在了有符号和无符号字符的交集之间。
2.不能修改字符串常量,因为其在内存里只有一份,如果更改会导致错误,比如"hello"变为"world",其实是改变了内存里面这个指针里的值,也就是说"hello"再打印时,打印出了world,因为打印的还是这个地址,地址里面的东西变了,所以编译器一般不允许更改。
3.不能把字符串常量赋值给一个字符数组,常量直接值时一个指针。
4.int* a,b,c;只有a是指向int的指针,其他都是int型。
5.常量const,简而言之const在*以及名字之前,这个值时不能改的,指针可以改,在*之后名字之前,指针的指向不能改变。
接着就是一个作用域与链接属性的问题,在不同作用域内,可以声明相同的变量名称,因为他们不会用相同的内存如
{
int f,g,i;
}
{
int i;
}
如果在外面声明了f,当进入小范围的作用域,再次声明定义,在这个范围内,会覆盖之前的值,退出作用域时还原。
如果在某个函数或者作用域内声明了如下的表示形式
int i,j;
{
int a,b;
{
static c; //或者extern
}
}
c离开作用域的时候还会存在。
extern 只对第一次声明有用,static可以将extern变为内部的静态,如果一个全局变量或者一个函数缺省的状态下都是设定为extern
数据的存储类型:普通内存、运行时堆栈、硬件寄存器。
1、在任何代码块之外声明的变量总是存储于静态内存中。
2、代码块内部声明的缺省变量都是自动的,存储在堆栈中,如果声明为static可以变为静态。
3、register可以用于自动变量的声明,称为寄存器变量,存储在机器的硬件寄存器,如果声明太多,只取前几个,其他为普通变量处理。
静态变量隐式的初始化为0.