第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定義的型別則無法保證。編譯器位於編譯過程的哪乙個...