前言:c語言中的陣列指標和指標陣列
陣列指標,是指向陣列的指標的縮寫;指標陣列,是存放指標的陣列的縮寫。其實很多時候,往往因為簡寫和縮寫帶給我們很多困惑。我曾想過不用簡稱去學習,但在很多時候,我們查詢的書籍文件和文章中還是會頻頻出現這樣的簡稱,所以有必要扣一下字眼了。
1int *p[3];//
優先順序大於*,所以p是乙個陣列,陣列中存放3個指向int的指標,這也就是指標陣列。
2int (*p1)[3];//
先看括號,p1是乙個指標,指向乙個陣列,陣列的型別為int,這也就是陣列指標。
無論在《c和指標》還是《effective c++》中,對於這樣稍微複雜一點的表示式進行解釋的時候,都告訴我們先從變數名開始讀,然後看變數名緊跟的運算子的優先順序,即可完成解讀。那麼這和this指標有什麼關係呢?關係就在於簡稱。
引用c++ primer中文版第五版上的原話:常量指標(const pointer)!當我第一次讀到這裡的時候,就覺得怪怪的,常量指標到底是指向常量的指標還是指標本身是常量?(這一點尤為重要)很明顯,根據英文const pointer顯示作者想要表達的是這個指標是乙個常量,也就是 t * const pointer,作為c語言的後續語言,我想在簡稱的時候也應該和c保持一致,const pointer簡稱為指標常量更好,t * const pointer 先找變數名pointer,往左讀,const證明是常量,讀完表示式,pointer指標是常量,簡稱指標常量更可取,為什麼呢?
陣列指標,強調了這是乙個指標,指向陣列;
指標陣列,強調了這是乙個陣列,陣列裡面存的指標。
那麼同理的話,常量指標,強調這是乙個指標,指向常量;
指標常量,強調常量,表示這個指標是常量即const pointer。
當然這是我個人從c過度而來並根據《c和指標》&&《effective c++》上的習慣,你也可以像書上一樣的簡稱,只要你明白具體的意思。但是最好使用的簡稱能快速反應出具體事實。就此,我認為該書此處釋義有待商榷。
說完前言,回到正題------this指標。
引用c++ primer上的例子:
1struct
sales_data
3......
4 std::string
bookno;
5 };
isbn函式時如何獲得bookno成員所依賴的物件的呢?
例如我們定義乙個:sales_data total;
然後 total.isbn();當我們呼叫成員函式時,實際上是在替某個物件呼叫它。成員函式通過乙個名為this的隱式引數來訪問呼叫它的那個物件。當我們在isbn函式中返回bookno的時候,其實隱式執行了this->bookno, 即total.bookno。this顧名思義,就是「這個」的意思,誰來呼叫成員函式,this就指向誰的指標。
total.isbn(); 編譯器等價地認為:sales_data:: isbn(&total);編譯器負責把total的位址傳遞給isbn的隱式形參this。在成員函式內部,我們可以直接使用呼叫該函式的物件的成員,而無需通過成員訪問符來做到這一點,因為this正是指向這個物件的。this形參是隱式的,任何自定義名為this的引數或者變數的行為都是非法的。因為this的目的總是指向「這個」物件, 所以this是乙個常量指標 (這是書上原話,而經過我剛才的前言,這裡改為指標常量更合適) 。即,this是乙個指標常量。這樣理解後面的就輕鬆多了。
在上面的例子中,this的型別是sales_data * const。儘管this是隱式的,但它也必須遵守初始化規則,預設情況下我們不能把this繫結到乙個常量物件上。c++中的做法是把const關鍵字放在成員函式的引數列表之後,此時緊跟在引數列表後面的const表示this是乙個指向常量的指標。這樣的函式也叫常量成員函式。即加了const在引數列表之後,this此刻的型別為const sales_data *const。
到這裡,以後自己寫成員函式的時候就不會那麼模糊了,首先明確this是乙個指標,它本身是個常量,要想把乙個常量繫結給this,我們需要把這個this指標限定為常量指標(指向常量的指標)。那麼,以後自己寫成員函式時,就把它當做乙個普通指標一樣對待,那麼,this將不再迷糊。不需要指向常量就不在引數列表後加const,需要就加上const。
note:
即使bookno定義在isbn之後,isbn還是可以使用bookno,編譯器分兩步處理類,首先編譯成員的宣告,然後才輪到成員函式體(如果有的話)。因此,成員函式體可以隨意使用類中的其他成員而無須在意成員出現的次序。
C 深入淺出之指標
1 指標陣列 char str 10 指標陣列,顧名思義是乙個陣列,其元素是乙個指標。上述 是定義乙個指標陣列,其陣列元素為指向字元的指標。所謂指標陣列,重頭戲在於陣列,指標可以抽象為修飾符,那麼如何來理解指標陣列呢?很簡單,的優先順序高於 因此先被結合,加上陣列名,就構成了陣列。2 陣列指標 in...
深入淺出之STL
c stl 標準模板庫 是一套功能強大的 c 模板類,提供了通用的模板類和函式,這些模板類和函式可以實現多種流行和常用的演算法和資料結構,如向量 鍊錶 佇列 棧。c 標準模板庫的核心包括以下三個元件 元件描述 容器 containers 容器是用來管理某一類物件的集合。c 提供了各種不同型別的容器,...
C 深入淺出Dynamic
我們知道c 是乙個強型別語言,也就是說編譯器在編譯的時候會堅持資料型別是否正確。但是dynamic的出現讓c 具有了弱語言型別的特性。編譯器在編譯的時候不再對型別進行檢查,編譯器預設dynamic物件支援你想要的任何特性。dynamic dy 100 dy.name 89 dy.getname 上例...