chapter1
1定義與宣告:定義是編譯器建立乙個物件,為這個物件分配一塊記憶體並給它取名字。宣告沒有分配記憶體。
2 register:
盡可能的將變數存在
cpu內部暫存器中而不是通過記憶體定址訪問以提高效率,但
register
不能用位址運算子&
3 static
作用:1
修飾變數
全域性和區域性
2 修飾函式成為內部函式
4關鍵字
sizeof
5 const:
編譯器通常不會為普通
const
唯讀變數分配儲存空間,而是將他們儲存在符號表中,這使得他成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它效率很高。
#define
巨集在預編譯階段進行替換,而
const
修飾的唯讀變數在編譯的時候確定其值。
#define
巨集沒有型別,而
const
修飾的唯讀變數具有特定的型別。
6volatile
:易變,不穩定。這種變數是隨時可能發生變化的。每次使用它的時候必須從記憶體中取出
i的值,即保證對特殊位址的穩定訪問。
7 struct最後1
個byte
長即使是空的也一樣
柔性陣列
(flexible array
)結構中的最後乙個元素允許是未知大小的陣列,叫做柔性陣列成員。
struct
預設屬性是
public
的8big endian :
字資料的高位元組儲存在低位址,低位元組儲存在高位址。
little endian:
字資料的低位元組儲存在高位址,低位元組儲存在低位址
怎樣check
是big endian
還是little endian
int checksystem()
c;c.i=1;
return(c.ch == )
}9 enum
與define
區別1 #define
巨集常量是在預編譯階段進行簡單替換,列舉常量則是在編譯的時候確定其值
2在一般編譯器裡,可以除錯列舉常量,不可以除錯
#define 3
列舉可以一次定義大量相關的常量,而
#define
巨集一次只能定義乙個
chapter3 preprocessing
10 #define#undef#include
#if#else#elif #ifdef#ifndef
#line
改變當前行數和檔名稱
#error
遇到#error
就會生成乙個編譯錯誤提示訊息,並停止編譯
#pragma
為實現時定義的命令,允許向編譯程式傳送各種指令例如,編譯程式可能有一種選擇,支援對程式執行的跟蹤,可用
#pragma
語句指定乙個跟蹤選擇。
與define
比,const
修飾的資料是有型別的,
#define
巨集定義的資料沒有型別。編譯器為
const
修飾的制度變數作型別校驗。但是
const
修飾的不是常量而是
readonly
的變數,
const
修飾的唯讀變數不能用來作為定義陣列的維數,也不能放在
case
關鍵字後面。
#undef
撤掉巨集定義
條件編譯
#ifdef #ifndef
#pragma
設定編譯器的狀態或者是指示編譯器完成一些特定的動作。
#pragma message
在編譯資訊輸出視窗輸出相應的資訊
#pragma pack
記憶體對齊
#pragma pack(n)
編譯器將按照
n個位元組對齊
#pragma pack()
編譯器將取消自定義位元組對齊
第五章記憶體管理
記憶體三個區:靜態區,堆,棧
靜態區:自動全域性變數和
static
變數,在整個程式的生命週期都存在
棧:儲存區域性變數,只在函式的範圍內存在,當函式執行結束,這些內容會被自動銷毀。效率高但空間大小有限。
堆:由malloc/new
分配,free/delete
決定
C語言深度剖析
c語言深度剖析 1,編譯器通常不為普通const唯讀變數分配儲存空間,而是將他們儲存在符號表中,使得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率更高。2,const int p p可變,p指向的物件不變。int const p p可變,p指向的物件不可變 int const p ...
C語言深度剖析
什麼是資料型別?資料型別是建立變數的模具 資料型別是建立變數的模具 型別的本質 資料型別可理解為固定記憶體大小的別名 資料型別的本質是固定記憶體大小的別名 變數本質 變數是一段實際連續儲存空間的別名 型別和變數的關係 vim program.c include int main gcc progra...
C語言深度剖析 列舉
列舉與 define巨集的區別 1 define 巨集常量是在預編譯階段進行簡單替換。列舉常量則是在編譯的時候確定其值。2 一般在編譯器裡,可以除錯列舉常量,但是不能除錯巨集常量。3 列舉可以一次定義大量相關的常量,而 define 巨集一次只能定義乙個。列舉能做到事,define 巨集能不能都做到...