第二章主要是闡述了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.