在C++中經過動態建立的對象,咱們只能得到一個指針,並經過指針控制它。指針是存放對象的內存地址值,更準確的描述是對象的起始地址值。每個指針都有一個相關的類型,不一樣數據類型的指針之間的區別不在指針的描述上,也不在指針所持有的地址上。而在於編譯器如何解釋特定內存地址上的內容。例如,在32位機器上,一個int型的指針地址在1000處,它跨越的尋址空間是1000~1003。一個double型的尋址空間是1000~1007。編程
這樣咱們就很容易理解在C++中,要給函數傳遞一個數組指針還必須告訴函數數組的長度。數組
1、是常量指針仍是指針常量框架
在使用指針的時候,首先容易混淆的如下兩個概念:函數式編程
1)const T *pt;函數
2)T *const pt;spa
3) const T *const pt;指針
第一個變量的含義是:pt是一個指針,這個指針的類型是const T。換句話說,你不能修改指針地址指向的值,可是你能夠修改地址。code
第二個變量的含義是:pt是一個常量指針,這個指針的類型是T。你能夠修改指針地址的值,可是不能夠修改地址。對象
第三個變量的含義是:你既不能修改值也不能修改地址。blog
2、爲何有些函數的形參是指針的指針
咱們常常會在一些第三方框架提供的函數接口中看到相似的形式(**T),這一般表示在函數內部會修改他們的地址。因爲C++的函數參數傳遞是經過copy完成的,指針類型在函數內部沒法經過改變地址的方式影響外部變量,例如:
int val = 5; void chg(int *pi) { pi = &val; } void free(string *ps) { ps = NULL; } int main() { int idx = 1; chg(idx); cout << idx; // idx == 1 string *s = new string("hello"); free(s); cout << *s; // hello }
僅僅經過傳遞指針類型沒法達到效果。
3、指向函數的指針
時下流行的函數式編程須要咱們將函數做爲參數傳遞給另外一個函數調用,函數指針是一個理想的實現方式。
int compare(const string &s1, const string &s2){} 函數指針的表達形式能夠是這樣:int (*pf)(const string &, const string &)。