《C專家程式設計》讀書筆記

2022-05-15 05:08:48 字數 3374 閱讀 4463

第一章

const float* 表示乙個指向float型別常量的指標

第二章

1. 在c語言中const並非真正表示「常量」,在陣列定義與case中不可以使用

2. case的一些問題

2:
3: main()
15: }

這段**列印出來的是:

3. 函式可見性

void sb(){}/*any where*/

2:

extern

void zt(){}/*any where best way!! */

3:

static

void sbzt(){}/*only in this file*/

4. c語言的一些符號過載

符號意義

static

在函式內部,表示該變數值在各個呼叫間一直保持一致

在函式宣告階段,表示該函式只對本檔案可見

extern

用於函式定義,表示全域性可見(雖然是預設的,應當養成良好的習慣使用)

用於變數,表示是在其他檔案中定義的變數

void

表示函式不返回值

宣告指標時,表示通用指標型別

在引數列表中表示沒有引數

5. sizeof +型別名的時候必須加括號 + 變數名時不需要(個人以為還是加上為好)

6. 運算優先順序問題

.的優先順序高於*

高於*函式()高於*

==、!= 高於位運算

==、!= 高於賦值運算

算數運算子高於位運算

,運算子優先順序最低

說多了都是淚,記的加上合適的括號!

7. 運算的結合順序

=賦值號右結合,先計算右側再複製,|| &&嚴格從左到有,但是函式引數的計算順序並不固定

8. gets()並不在意buffer的長度,記的使用fgets()替換它

第三章

1. 變數的宣告應該與型別的宣告分開

2. 預設情況下,列舉的值從1開始,當某一值被人為賦值後,接下來的值+1

3.c語言生命的優先順序規則:

1) 從名字開始讀取,按如下優先順序進行

2) 優先順序從高到低:

a. 包含名字被括號括起來的部分

b. 字尾操作符:

表示陣列

()表示函式

c. 字首操作符:*表示指標

d. const右側有有型別說明符,表示const修飾型別說明符

否則,const是左邊*號的修飾

4. typedef應當用在

1) 陣列、結構、指標以及函式的組合型別;

2) 可以移植的型別;

note:結構標籤的命名請使用統一的標記字首或者字尾;

第五章

1. 對於多為陣列,需要提供出去最左邊一維之外其他維度的長度

2. 陣列名是乙個左值,但不是可以修改的左值(左值在編譯時可知,表示儲存結果的地方,右值到運算時才可知)

3. 指標與陣列的區別(char* p,char a):

指標:p先取得指標指向位址的內容,與偏移量相加,再取值;

陣列:a就是乙個位址,直接與偏移量相加,取值;

4. char *p = 」abc」;先建立乙個字串常量,然後將p指向他!*p = 「sbn」;改變的是p中儲存的位址,並非修改了之中的內容

第五章

1. 動態鏈結&靜態鏈結

動態鏈結體積小,節省空間,速度略慢

所有動態鏈結到某個特定函式庫的可執行檔案在執行時共享該函式庫的乙個單獨的拷貝

靜態鏈結的最大危險在於將來版本的作業系統可能與可執行檔案所繫結的函式庫不相容

對於函式庫應當始終使用與位置無關**

第六章

1. 程式在記憶體中的分布(linux)

棧      進行函式呼叫 儲存函式引數 儲存臨時變數 儲存返回位址 alloca()函式分配的記憶體

堆      儲存程式中動態分配的記憶體malloc/new

.bss   未初始化的全域性變數

.data  初始化過的全域性變數

.text   編譯後的主體

2. 棧的結構:

棧頂main函式區域性變數

引數前乙個活動記錄(mai函式指向棧頂)

返回位址

函式的區域性變數

引數返回位址

3. 通常情況下從棧內獲取記憶體的速度要快一些

第七章

1. malloc&calloc

類似,但是calloc在返回值診之前吧分配好的記憶體全部清0

2. 段錯誤的幾個常見原因

解除引用乙個包含非法值的指標

解除引用6乙個空指標

在未得到正確的許可權是進行訪問

用完了堆或者棧空間

第八章

1. 若使用了函式原型,就不會預設對引數進行提公升

2. 將函式原型放在標頭檔案中,函式的定義放在.c中

3. 函式指標 int(*a)();

4. 呼叫函式和通過指標呼叫函式可以使用同一種語法

第九章

1. 所有座位函式引數的陣列名總是可以通過編譯器轉換為指標

2. 每個指標只能指向一種型別的原因在於:編譯器需要知道對指標進行解除引用操作時應該取幾個位元組,以及每個下標的步長應該取幾個位元組。

3. 下面的程式

2:
3:

int a[10];

4:
5:

void s( int a )

8:
9: main()

列印的兩個結果分別為40和4

4. 只有字串指標可以初始化指標陣列,其他的都不行:

char* a = //可以!!

int* b = ,,}//不可以!!

第十章

1. 指向23個字元的指標陣列: char* a[23]

指向乙個具有23個字元的陣列的指標: char (*a)[23]

2. 向函式傳遞多維陣列時,除了要傳遞陣列名,還要傳遞每一維的長度(最左一維也許可以省略,但別的不可以!!!)eg: void fk(int a[2][3][4]){}

3. 多維陣列作為引數時,陣列會被改寫為「陣列的指標」

第十一章

c++了沒什麼好寫的

that』s all!

《C 專家程式設計》讀書筆記

前言 程式設計挑戰 計算機日期 第二章 這不是bug,而是語言特徵 switch的乙個bug break中斷了什麼 第三章 分析c語言宣告 程式設計挑戰 把c 語言的宣告翻譯成通俗的語言 include include include include define max len 100 enum ...

《C專家程式設計》讀書筆記9

第九章 再論陣列 宣告本身還可以進一步分成3種情況 外部宣告 external array 的宣告。陣列的定義 記住,定義是宣告的一種特殊情況,它分配記憶體空間,並可能提供乙個初始值 函式引數的宣告。所有作為函式引數的陣列名總是可以通過編譯器轉換為指標。作為函式定義的形式引數,char s和 cha...

《C專家程式設計》讀書筆記10

第十章 再論指標 char pea 4 6 的記憶體布局。單個元素的儲存和引用是以線性形式排列在記憶體中的。首先找到pea i 的位置,然後根據偏移量 j 取得字元。因此,pea i j 將被編譯器解析為 pea i j 可以通過宣告乙個一維指標陣列,其中每個指標指向乙個字串來取得類似二維字元陣列的...