指針的一些基礎的東東

    指針,其實用的熟透的話,是個非常好的東東;因此,初來乍到的人,看到強盜、無敵而又可愛的她是那麼的束手無策,像是什麼看到了刺蝟而無從下口,讓人肝%@#寸*&^~的,不知然多少人抓亂了頭髮,掉了多少頭髮,心裏暗暗發誓,俺就不信你的鞋,就要把你搞定不可,然後就咔咔咔……

    嗯,不錯,其實,指針就這樣,咋樣呢?

    我們也要區分內存單元地址和內存單元內容。

    我們在程序中定義的不管是何種類型的變量,表面上都是通過對應類型的變量名來對內存單元進行存取操作的;但是,深層次的,程序在經過編譯系統編譯後,已經將變量名轉換爲變量的地址(即變量名是與其地址相對應),因此,對變量值的存取,都是通過其對應的地址進行的。此即爲:直接存取或直接訪問。

    因此,利用 & -》 取地址運算符,可以取得變量的地址,儲存在對應的指針變量中,然後通過指針變量間接訪問所指向的變量。所謂指向,是通過地址來體現的,用 "->" 來表示這種指向關係。

    指針變量是專門用來存放另一變量 - - -(無論是內置類型還是自定義類型)的地址 - - -(即:我們該明瞭,變量的地址即爲該變量的指針,變量的指針就是變量的地址。說白了就是指針即地址,地址即指針。);- - - 所以說指針變量是區別於指針的。

    基類型* 指針變量名 (基類型* 也可說是地址類型,指針類型),注意哦:在變量名前面的"*" 表示該變量是指針變量,它不是指針變量的一部分。因爲指針變量是用來存放變量地址的,因此對她賦值或初始化的時候要小心了!!!

    指針作爲函數參數,她的作用是將一個變量的地址傳給被調用函數的形參。

    要知道怎麼解析含有 & (取地址運算符) 和 *(解引用操作符)的表達式???

    指針與數組

    指向數組元素的指針

    數組元素的指針即爲數組元素的地址;因此,可以定義指針指向數組元素;我們應該明白一點:數組名是數組首元素的地址,定義且編譯後其值相當於是一個常量 - - - (有的直接說就是常量,但是數組名它卻不佔用內存空間,而常量他是要佔用存儲空間的);因此,不能對數組名進行賦值,也不能對它進行自增、自減這種運算,但是可以參與其它的一些運算。

    我們經常碰到這種情況:指針變量 pointer 指向一個數組,且pointer等於數組名(即是將數組首元素地址賦給pointer),若有此:pointer+i - - -> 解析:pointer是地址,加的可不是i(偏移量),而是數組元素在內存中所佔的字節數,即pointer + i*d (d = sizeof(類型))。

    對於數組中的任意元素 eg:arr[i] ,實際上在編譯系統編譯時,對arr[i]是按照 *(arr+i) 來處理的,即:數組首元素的地址加上相對偏移量(或說是位移量),得到要找的數組元素的地址,然後用解引用操作符得到單元中的內容。

    幾種等價的形式:arr[i] <=> *(arr+i) <=> pointer[i] <=> *(pointer+i)

    怎麼解析:*pointer++ 與 *++pointer ??? 

    還有:*pointer-- 與 *--pointer ???(很多人都會犯糊塗的滴哦!!! 好像譚老師的解釋也不對哦!!!)

    訪問數組中數組元素可用:下標法(直觀)、指針法(佔用內存少,運行速度快)、地址法、指針變量

    用指針變量做函數參數接收數組地址

    C++編譯系統將形參數組名一律當作指針變量來處理

    比如:

      void func(int array[],int n)

      void func(int* array,int n)

    上面兩種方式是等價的;(可以用sizeof()來檢驗他們在內存中佔用的存儲空間,同時與主函數中相比,會得到結果滴!)

    因爲在調用函數的時,系統會建立一個指針變量array,用來存放從主調函數傳遞過來的實參數組首元素的地址。

    實際上在函數調用時並不存在一個佔有存儲空間的形參數組,只有指針變量。但是可以講形參數組看做從實參數組那裏得到其起始地址,並與其共用一段內存空間。

    注意:形參數組名是指針變量,因此其值可以改變的(⊙o⊙)…

    區分const T* p 、T const * p 與 T* const p

    const T* p 與 T const * p 的意思完全一樣,禁止該指針變量修改其所指向的變量的內容,只能查看,即使指向的內容可以修改(其它途徑)

    T* const p 指針p是隻讀的,因爲其前有const限制,且必須進行初始化,而不能對其賦值,但可對其所指向的內容進行修改。

    數組、函數與指針

    T* p[n] - -> p是一個數組,有n個元素,每個元素是指向T的指針變量,(這即是指針數組,有n個指向T型的指針變量組成)

    T(*p)[n] - -> p是一個指針,指向由n個元素組成的T數組,(p爲指向含有n個元素的一維數組的指針變量)

    T* p( ) - -> p是一個函數,返回值的類型爲T*,(p爲帶回一個指針的函數,該指針指向T型)

    T(*p)( ) - -> p爲一個指針,指向的是一個返回值T型的函數,(p爲指向函數的指針,該函數返回一個T型數據)

    T** p - -> p爲一個二級指針變量,指向的是一個指向T型變量的指針變量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章