C語言指針及數組

作者: Lua  來源: 博客園  發布時間: 2010-12-12 20:57  閱讀: 818 次  推薦: 0   原文鏈接   [收藏]  

  C語言的指針與數組是一個比較高階的話題,有些書就是照本宣科,讀者看完會認為自己明白了。真要是碰到一些模棱兩可的問題,就發現自己了解的還不夠深入,那時候就棘手了。我在前面提到的《C語言趣味題目》http://sunxiunan.com/?p=1647就是一個例子,如果你對里面的題目都完成的非常完美,那指針與數組的話題其實也沒必要看了,你一定已經是一個C語言方面的高手。

  C語言的指針,是C語言里最為靈活最有力量也最容易產生問題的強力武器。數組相對來講花樣少一些,但也有些比較容易出問題的知識點。

  如果你想系統深入了解指針,我推薦你完整系統的閱讀這幾本書《C Programming language》也就是(K&R圣書),第二本是《C專家編程》,里面關于數組與指針的闡述盡管已經過去十多年依然是熠熠生輝,沒有其它書籍能趕上,另外還可以看看《C與指針》這本書,其實也是一本C語言系統教材,把指針單獨提出了,也體現了指針的強大威力,還有一本是《C陷阱與缺陷》,也是非常值得一讀。

  如果看完這些書,可以看看幾個專門闡述C指針或者包含相關內容的文檔,比如:

  http://home.netcom.com/~tjensen/ptr/pointers.htm A TUTORIAL ON POINTERS AND ARRAYS IN C

  http://publications.gbdirect.co.uk/c_book/ 這本書在線免費閱讀

  http://boredzo.org/pointers/ Everything you need to know about pointers in C

  http://www.cs.cf.ac.uk/Dave/C/node10.html Common Pointer Pitfalls 這是從wiki的pointer頁面上發現的

  http://www.knosof.co.uk/cbook/cbook.html New C Standard, 云風在他的blog推薦過。

  http://learn.akae.cn/media/index.html Linux C編程一站式學習

  C語言中的指針是什么,數組是什么,該如何定義初始化,我在這里不多講,任何一本C語言的教材或者我前面推薦的K&R都有很詳細的解釋。

  關于指針與數組最經常提到的問題就是在定義為functionA(int * p),然后可以直接把int numArray[5]這樣的數組直接作為參數傳入,或者聲明declaration與定義definition不匹配,如extern定義為char* 但是實際上是char[]。

  其實我們只要記住指針與數組的幾個不同點,到時候類似問題就很容易搞掂了。在《C專家編程》里面列出一些,我這里簡述一下:

  第一點也是最關鍵一點,指針訪問是間接的,也就是指針存放的是一個地址的值,存放的是被指內容的地址,其實類似一個中轉站或者114的功能,如果想取得指針所指向的內容,必須做提領(deference)操作,實際上類似于兩個步驟(先取得指針的內容也就是p存放的地址值,然后取得存放地址里面內容)。而數組里存放的就是數組的值,不是什么間接引用的地址,比如我們要取arr[5]的值,只要從arr開始數5個位置,里面就是a[5]的內容。

  另外一點不同是,假如我們有個數組int array[5],數組的地址&array與數組名字array本身代表的地址是不一樣的。&array實際上是一個int (*p1)[5]類型的指針,p1每一步遞增遞減都是sizeof(array),也就是5個int長度。而array相當于&array[0],也就是第一個元素(element)的地址,類型是int *p2,p2每一步遞增都是sizeof(int)。這個區別在指向二維數組或者多維數組指針里非常需要注意。

  再有一點不同是,一般指針類型(除了int *const p這種)都是沒有名字的,可以隨意的指來指去的,另外指針可以有加減計算,加上減去一定的值。而數組相當于,定義以后就不可以修改數組地址了,這也是前面一條我都會說有一個p1或者p2指針,而不是數組array本身。盡管數組array有類似指針的行為,也是某種地址,但是它不可以進行加減操作,我們可以認為數組array本身是一個常量。

  還有一點不同是,指針可以初始化為NULL,另外可以聲明為void指針,還可以聲明非常復雜的函數指針、指針的指針、字符串指針等等,但是數組沒法定義為函數數組。

  什么情況下指針與數組的概念可交換?《C專家編程》總結的以及相當全面,我在這里簡單列兩條,深入的內容請看書。1)使用a[i]這種形式對數組訪問,編譯器改寫為*(a + i)形式,這也是為何i[a]這樣寫也編譯運行通過的原因。2)作為函數參數時,數組會被修改為指向數組第一個元素的指針。

  關于指針還有很多高階內容,比如復雜的指針聲明該如何解讀?int const * p1與int * const p2的不同之處?sizeof *ptr 與 sizeof ptr結果?這里就不一一講述了,畢竟這篇文字是給我自己做一個知識備份。

0
0
 
標簽:C語言 指針
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()