指針,其實用的熟透的話,是個非常好的東東;因此,初來乍到的人,看到強盜、無敵而又可愛的她是那麼的束手無策,像是什麼看到了刺蝟而無從下口,讓人肝%@#寸*&^~的,不知然多少人抓亂了頭髮,掉了多少頭髮,心裏暗暗發誓,俺就不信你的鞋,就要把你搞定不可,然後就咔咔咔……
嗯,不錯,其實,指針就這樣,咋樣呢?
我們也要區分內存單元地址和內存單元內容。
我們在程序中定義的不管是何種類型的變量,表面上都是通過對應類型的變量名來對內存單元進行存取操作的;但是,深層次的,程序在經過編譯系統編譯後,已經將變量名轉換爲變量的地址(即變量名是與其地址相對應),因此,對變量值的存取,都是通過其對應的地址進行的。此即爲:直接存取或直接訪問。
因此,利用 & -》 取地址運算符,可以取得變量的地址,儲存在對應的指針變量中,然後通過指針變量間接訪問所指向的變量。所謂指向,是通過地址來體現的,用 "->" 來表示這種指向關係。
指針變量是專門用來存放另一變量 - - -(無論是內置類型還是自定義類型)的地址 - - -(即:我們該明瞭,變量的地址即爲該變量的指針,變量的指針就是變量的地址。說白了就是指針即地址,地址即指針。);- - - 所以說指針變量是區別於指針的。
基類型* 指針變量名 (基類型* 也可說是地址類型,指針類型),注意哦:在變量名前面的"*" 表示該變量是指針變量,它不是指針變量的一部分。因爲指針變量是用來存放變量地址的,因此對她賦值或初始化的時候要小心了!!!
指針作爲函數參數,她的作用是將一個變量的地址傳給被調用函數的形參。
要知道怎麼解析含有 & (取地址運算符) 和 *(解引用操作符)的表達式???
指針與數組
指向數組元素的指針
數組元素的指針即爲數組元素的地址;因此,可以定義指針指向數組元素;我們應該明白一點:數組名是數組首元素的地址,定義且編譯後其值相當於是一個常量 - - - (有的直接說就是常量,但是數組名它卻不佔用內存空間,而常量他是要佔用存儲空間的);因此,不能對數組名進行賦值,也不能對它進行自增、自減這種運算,但是可以參與其它的一些運算。
我們經常碰到這種情況:指針變量 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型變量的指針變量