C語言深度剖析

2021-09-07 02:59:58 字數 1203 閱讀 3065

c語言深度剖析

1,編譯器通常不為普通const唯讀變數分配儲存空間,而是將他們儲存在符號表中,使得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率更高。

2,const int *p;//p可變,p指向的物件不變。

int const *p;//p可變,p指向的物件不可變;

int * const p;//p不可變,p指向的物件可變; 

const int * const p;//指標p和p指向的物件都不可變。

方法是先忽略型別名,看const靠哪個近;

3,空結構體的大小為1,編譯器為每個結構體型別資料至少預留1個位元組的空間。

4,柔性陣列成員允許結構體中包含乙個大小可變的陣列,sizeof返回的這種結構大小不包含柔性陣列的記憶體,包含柔性陣列成員的結構用malloc函式進行記憶體的動態分配,並且分配的記憶體應該大於結構的大小

以適應柔性陣列的預期大小。struct st;sizeof(st)=4;不包含柔性陣列的大小;struct st *p=(struct st*)malloc(sizeof(st)+100*sizeof(int));

5,乙個union只配置乙個足夠大的空間以容納最大長度的資料成員。

6,#pragma comment(lib,"user32.lib");該命令將user32.lib庫檔案加入到本工程中

7,乙個基本的資料型別(包含結構體等自定義型別)加上*號後就構成了乙個指標型別,這個指標的大小是一定的域*前的資料型別無關。*前的資料型別只是說明指標所指向的記憶體裡儲存的資料型別。

8,sizeof(a[max]):求陣列最後乙個元素的大小,雖然不存在,但sizeof是關鍵字在編譯時求值,所以並不真正訪問陣列而是根據陣列元素的型別確定大小。

9,&a[0]和&a雖然值一樣但意義不一樣。前者是陣列首元素的首位址而後者是陣列的首位址。

10,無法把指標變數本身傳遞給乙個函式。

11,記憶體簡單的分為靜態區,棧,堆;

靜態區:儲存自動全域性變數和static變數(static包含全域性和區域性變數),靜態區的內容在總個程式的生命週期都存在,在編譯的時候分配。

棧:儲存區域性變數,棧上的內容只在函式的範圍內存在,自動銷毀,效率高,空間大小有限。

堆:有malloc系列函式或new操作符分配的記憶體。

12,malloc函式返回值是乙個void 型別的指標。free函式之後指標變數p本身儲存的位址並沒有改變,需要重新初始化為null,如果不null就成為了野指標。

C語言深度剖析

什麼是資料型別?資料型別是建立變數的模具 資料型別是建立變數的模具 型別的本質 資料型別可理解為固定記憶體大小的別名 資料型別的本質是固定記憶體大小的別名 變數本質 變數是一段實際連續儲存空間的別名 型別和變數的關係 vim program.c include int main gcc progra...

C語言深度剖析 列舉

列舉與 define巨集的區別 1 define 巨集常量是在預編譯階段進行簡單替換。列舉常量則是在編譯的時候確定其值。2 一般在編譯器裡,可以除錯列舉常量,但是不能除錯巨集常量。3 列舉可以一次定義大量相關的常量,而 define 巨集一次只能定義乙個。列舉能做到事,define 巨集能不能都做到...

《C語言深度剖析》筆記

c語言深度剖析 筆記 1.在c語言中,凡不加返回值型別限定的函式,就會被編譯器作為返 回整形處理。2.register 變數必須是乙個單個的值,並且其長度應小於或等於整型 的長度。而且 register 變數可能不存放在記憶體中,所以不能用取 址運算子 來獲取 register變數的位址。3.int...