C專家程式設計學習筆記 2

2021-06-16 04:15:27 字數 982 閱讀 6231

第4章:令人震驚的事實:陣列和指標並不相同

1.區別定義和宣告

宣告相當於普通的宣告:它所說明的並非自身,而是描述其他地方的建立的物件.

定義相當於特殊的宣告:它為物件分配記憶體

2.當書寫了extern char *p,然後用p[3]來引用其中的元素時,編譯器將會:

(1) 取得符號表中p的位址,提取儲存與此處的指標

(2) 把下標所表示的偏移量與指標相加,產生乙個位址

(3) 訪問上面的位址,取得字元

既然把p宣告為指標,那麼不管p原先是定義為指標還是陣列,都會按照上面所示的三個步驟進行操作,但是只有當p原來定義為指標時這個方法才是正確的.

p在這裡宣告為extern char *p;而它原先定義的卻是char p[10];這種情形.當用p[i]這種形式提取這個宣告的內容時,實際上得到的是乙個字元.但按照上面的方法,編譯器卻把他當成乙個指標,把acsii字元解釋為位址顯然是牛頭不對馬嘴.

3.陣列和指標的區別

指標陣列

儲存資料的位址

儲存資料

間接訪問資料

,首先取得指標的內容

,把它作為位址

,然後從這個位址提取資料

. 如果指標有乙個下標

[i],

就把指標的內容加上

i作為位址

,從中提取資料

直接訪問資料

,a[i]

只是簡單的以

a+i為位址取得資料

通常用於動態資料結構

通常用於儲存固定數目且資料型別相同的元素

相關的函式為

malloc(),free()

隱式分配和刪除

通常指向匿名資料

自身即為資料名

引數不匹配,因促需要強制轉換.

qsort(a, 10, sizeof(int), (int (*)(const void*, const void*)) intcompare);

《C專家程式設計》學習筆記2

乙個 l的 nul用於結束乙個ascll字串 兩個l 的null 用於表示什麼也不指向的指標 標準的c編譯器至少允許一條switch語句中有257個case標籤。為了滿足乙個8bit的字元的所有情況。switch的另乙個問題是它內部的任何語句都可以加上標籤,並在執行時跳轉到 這就有可能破壞程式流的結...

《C專家程式設計》筆記2

無論在什麼時候,如果遇見了這樣一條語句malloc strlen str 幾乎可以斷定它是錯誤的,malloc strlen str 1 才對 總結 進步是計算機軟體工程和程式語言設計藝術逐步發展的重要動因 includeint main int argc,char argv 以上 編譯都不會通過,...

C專家程式設計學習筆記一

typedef和巨集文本替換的重要區別 首先,可以用其它型別說明符對巨集型別名進行擴充套件,但對typedef所定義的型別名卻不能這樣做。其次,在連續幾個變數的宣告中,用typedef定義的型別能夠保證宣告中所有的變數均為同一種型別,而用 define定義的型別則無法保證。編譯器位於編譯過程的哪乙個...