C++Primer再讀讀書筆記:第四章

一、數組


       數組是有類型名、標識符和維數組成的複合數據類型,類型名規定了存放在數組中的元素類型,維數則指定數組中包含的元素個數。
      1、數組的長度是固定的,與vector類型不同,數組不提供push_back或者其他的操作在數組中添加新元素。如果必須添加新元素,程序員必須自己管理內存,重新分配一個新的內存空間更大的數組,複製所有元素到新的數組

      2、數組元素也是從0開始計數,vector中使用vector::size_type作爲下標類型,在數組中下標的正確類型是size_t。
const size_t array_size = 10;
intg ia[array_size];
for(size_t ix=0; ix != array_size; ++ix)
     ia[ix] = ix;
       3、導致安全問題的最常見原因是所謂的“緩存區溢出(buffer overflow)”錯誤,當沒有檢測下標引用了越出數組或者其他類似數據結構邊界時容易出現這個錯誤。

二、指針


       指針是指向,某種類型對象的符合數據類型,是用於數組的迭代器,指向數組中的一個元素。
       1、指針是什麼:指針就是用於指向對象,保存的是另一個對象的地址。
string s("hello world");
string *sp = &s;
       2、取地址符用戶於一個對象上,返回該對象的存儲地址,取地址符只能用於左值,只有變量作爲左值時才能取地址,

       3、很多運行時錯誤都源於使用了未初始化的指針。

       4、對指針進行初始化或者賦值只能使用以下四種類型的值:
  • 0值常量表達式
  • 類型匹配的對象的地址
  • 另一個對象之後的下一個地址
  • 同類型的另一個有效指針         
      5、指針操作:
         6、指針和引用的比較

              引用總是指向某個對象,定義引用時沒有初始化是錯誤的;賦值行爲的差別,給引用賦值修改的是該引用所管理的對象的值,而並不是使引用與另一個對象關聯。引用一經初始化就始終指向這個特定對象。

         7、指向指針的指針

              指針本身也是可用指針指向的內存對象。指針佔用內存空間存放其值,隱藏指針的存儲地址可存放在指針中;
int ival = 1023;
int *pi = &ival;
int **ppi = π
         8、指針的算術操作
         指針的算術操作只有在原指針和計算出來的新指針都指向同一個數組元素,貨指向該數組存儲空間的下一單元時才合法,如果指針指向同一對象我們還可以在指針上加1從而獲取指向相鄰的下一個對象的指針。
 
        9、下標和指針

         在表達式中使用數組名,實際上使用的是指向數組第一個元素的指針。
int ia[] = {0,2,4,6,8};
int i = ia[0];    
          ia[0]是一個使用數組名的表達式,在使用下標訪問數組時,實際上是指向數組元素的指針做下標操作。
int *p = &ia[2]; 
int j = p[1];    //p[1] == ia[3]
int k = p[-2]; //p[-2] == ia[0]          
         10、指針和const限定符

三、創建動態數組


       數組類型的變量有三個重要的限制:數組長度固定不變,在編譯時必須知道其長度,數組只在定義他的塊語句中存在。可以在運行時動態的分配數組。可以在動態確定數組的長度。c語言使用標準庫的malloc和free在自由存儲區中分配空間,C++使用new和delete實現該功能。
        1、動態數組的定義
int *pia = new int[10]; // array of 10 uninitialized ints
        只需指定類型和數組的長度,創建完成後new將返回指向數組第一個元素的指針。在自由存儲區創建的數組是沒有名字的,通過間接的訪問堆中的對象。

         2、初始化動態分配的數組

         動態分配數組時,如果數組元素具有類類型,將使用該類的默認構造函數,初始化,如果是內置類型就無初始化。
string *psa = new string[10] ;  // 定義10個空string的數組
int *pia = new[10];    // 定義10個未初始化的int數組
          對於動態分配的數組,其元素只能初始化爲元素類型的默認值,而不能像數組變量一樣,用初始化類別爲數組元素提供各不相同的初值。

          3、動態空間的釋放
 
         動態分配的內存最後必須進行釋放,否則,內存最終將會逐漸耗盡。c++爲指針提供deletep[]表達式來釋放所指向的數組空間。
delete []pia;  //該語句回收pia所指向的數組,把相印的內存返還給自由存儲區。 

發佈了154 篇原創文章 · 獲贊 870 · 訪問量 85萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章