C語言指標及數組

來源:互聯網
上載者:User

http://sunxiunan.com/?p=1650

 

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結果?這裡就不一一講述了,畢竟這篇文字是給我自己做一個知識備份。如果大家有指標相關問題,歡迎留言,我會盡量解答。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.