天天看點

C++數組指針、指針數組、函數指針的核心概念

1.什麼叫數組指針?

          數組指針:一個指向一維或者多元數組的指針。

          比如:int * b=new int[10];指向一維數組的指針b ; 注意,這個時候釋放空間一定要delete [] ,否則會造成記憶體洩露,b 就成為了空懸指針。

        int (*b2)[10]=new int[10][10]; 注意,這裡的b2指向了一個二維int型數組的首位址。

        注意:在這裡,b2等效于二維數組名,但沒有指出其邊界,即最高維的元素數量,但是它的最低維數的元素數量必須要指定!就像指向字元的指針,即等效一個字元串,不要把指向字元的指針說成指向字元串的指針。這與數組的嵌套定義相一緻。

       int(*b3) [30] [20];  //三級指針――>指向三維數組的指針;

      int (*b2) [20];     //二級指針;

      b3=new int [1] [20] [30];

      b2=new int [30] [20];

     兩個數組都是由600個整數組成,前者是隻有一個元素的三維數組,每個元素為30行20列的二維數組,而另一個是有30個元素的二維數組,每個元素為20個元素的一維數組。

     删除這兩個動态數組可用下式:

     delete [] b3;  //删除(釋放)三維數組;

     delete [] b2;  //删除(釋放)二維數組;

     再次重申:這裡的b2的類型是int (*) ,這樣表示一個指向二維數組的指針。b3表示一個指向(指向二維數組的指針)的指針,也就是三級指針.

2.什麼叫指針數組?

       指針數組:一個數組裡存放的都是同一個類型的指針,通常我們把他叫做指針數組。

       比如 int * a[10];它裡邊放了10個int * 型變量,由于它是一個數組,已經在棧區配置設定了10個(int * )的空間,也就是32位機上是40個byte,每個空間都可以存放一個int型變量的位址,這個時候你可以為這個數組的每一個元素初始化,或者單獨做個循環去初始化它。

       舉例:聲明一個指針數組如下所示,可了解為:首先,其為一個3維數組,數組裡存放的是傳回int型的指針。

1. int *p[3];
2.  p[0] = new int[4];
3.  p[1] = new int[5];
4.  p[2] = new int[6];
5. 
6. delete p[0];
7. delete p[1];
8. delete p[2];
9.      

3.什麼是函數指針? 

      關于函數指針,我想在我們可能需要寫個函數,這個函數體内要調用另一個函數,可是由于項目的進度有限,我們不知道要調用什麼樣的函數,這個時候可能就需要一個函數指針;

     int a();這個一個函數的聲明;

     int (*b)();這是一個函數指針的聲明;

     讓我們來分析一下,左邊圓括弧中的星号是函數指針聲明的關鍵。另外兩個元素是函數的傳回類型(void)和由邊圓括弧中的入口參數(本例中參數是空)。注意本例中還沒有建立指針變量-隻是聲明了變量類型。

      目前可以用這個變量類型來建立類型定義名及用sizeof表達式獲得函數指針的大小:

      unsigned psize = sizeof (int (*) ()); 獲得函數指針的大小

     為函數指針聲明類型定義  typedef int (*PFUNC) (); //PFUNC是一個函數指針,它指向的函數沒有輸入參數,傳回int。使用這個類型定義名可以隐藏複雜的函數指針文法,就我本人強烈建議我們大内弟子使用這種方式來定義。

繼續閱讀