在大部分情況下,陣列和指標是可以互換的。書中的第4章主要講解了陣列和指標的不同之處,而在第9章則著重討論兩者可以互換的場景。
對於兩者的不同之處,主要在於訪問兩者時有一些不同。
編譯器會為每個變數分配乙個位址,每個符號的位址在編譯時可知(如陣列的名字)。那麼在訪問陣列中的資料時,可以通過符號表直接得出陣列的起始位址,加上偏移量即可訪問對應的資料。
而對於指標,必須先在執行時取得它當前儲存的值,再對它解引用來獲取(陣列的)起始值,最後才能加上偏移量來訪問資料。
指標陣列
儲存資料的位址
儲存資料
間接訪問資料,首先取得指標的內容,把它作為位址,然後從這個位址提取資料。
如果指標有乙個下標[i],就把指標的內容加上i作為位址,從中提取資料
直接訪問資料,a[i]只是簡單的a+i為位址取得資料
通常用於動態資料結構
通常用於儲存固定數目且資料型別相同的元素
相關的函式為malloc(),free()
隱式分配和刪除
通常指向匿名資料
自身即為資料名
在書中,主要從「宣告」和「使用」兩種情況下進行討論,直接看圖:
在c語言標準中,有若干條規則對兩者間的聯絡進行了說明,本書作者對其進行了進一步的說明:
「表示式中的陣列名」就是指標c語言把陣列下標作為指標的偏移量
「作為函式引數的陣列名」等同於指標
#include #define pr(fmt,val) printf(#val " = %" #fmt "\t", (val))
#define nl putchar('\n')
#define print1(f,x1) pr(f,x1), nl
#define print3(f,x1,x2,x3) pr(f,x1), print2(f,x2,x3)
static void func1(char ca)
static void func2(char* pa)
char ga = "abcdefg";
int main()
執行結果如下:
&ga = 0x37c3b010 &(ga[0]) = 0x37c3b010 &(ga[1]) = 0x37c3b011
&ca = 0x7f38c918 &(ca[0]) = 0x37c3b010 &(ca[1]) = 0x37c3b011
&pa = 0x7f38c918 &(pa[0]) = 0x37c3b010 &(pa[1]) = 0x37c3b011
++pa = 0x37c3b011
可以看出作為引數,陣列的位址和陣列的第乙個元素的位址是不同的。 C專家程式設計
說到c語言,首稱 c程式語言 這是一本入門和進修均可的書籍,值得讀三遍以上,方才有味。進修書籍如 c專家程式設計 是一本c語言較高層次的書,是成為c語言專家的必經之路。我自以為達到了一定的 程度,才開始學習這本書的。人言,c語言是一門藝術,需要多年歷練才能達到較為完善的境界,此言不虛。c語言進修書籍...
C 專家程式設計
2011.9.4 c 專家程式設計 1 容易混淆的 const 關鍵字const 並不能把乙個變數變為常量,它修飾的符號僅表示該符號的值不能被賦值,也就意味著唯讀不可寫,但它並不能防止通過程式內部 甚至外部,其它函式 的方法來修改它。const 最有用支出是用來限定函式的形參,這樣該函式不會修改實參...
c專家程式設計
pag13 關於替代庫函式 標準規定編譯器只有在違反語法規則和約束條件的情況下才能產生錯誤資訊。所有c語言標準標頭檔案中宣告的識別符號均保留,所以不能宣告乙個叫做malloc 的函式,因為在標準標頭檔案裡已經有乙個函式以此為名。但由於這個規定不是約束條件,因此可以違反他。所以可以用自己宣告的函式來替...