C++指針和數組:二級指針和二維數組

1、在講二維數組之前,我們先搞清楚一些基本的概念:

       1)、數組名代表的是數組首元素的地址,這是一個常量。即數組已經定義,它的含義便已經明確了,數組就是一個固定內存塊大小的別名

       2)、數組首元素的地址和數組的地址是不同的東西

       3)、數組也是一種數組類型,其類型由構成數組的元素的類型和數組的大小一起決定


        現在對上面所提到的內容進行一下詳細的解釋:

       看一個例子

       

            我們可以看到,數組一經定義,不管有沒有顯示初始化,其所指向的內存空間便已經定了下來。


          我們都知道,數組一經定義,其大小便確定下來了,所以我們直接用sizeof(array_int1)來得到數組的大小,經過測試,sizeof(array_int1) = 40;

           現在再求sizeof(&array_int1),可以得到sizeof(&array_int1) = 4。爲什麼會時上面的結果呢?

          上面說了,數組類型是由構成數組的元素的類型和數組的大小一起決定。例如:int  array_int1[10],便是代表一種int [10] 的數據類型, 同理  float  f_float1[12] 便是代表一種float [12]的數據類型。既然是這樣,我們便可以定義一個數組類型,使用typedef  ,例如  typedef  int  (array_int)[5], typedef double (ayyay_double)[4] 。


              很明瞭吧,有一點需要注意的就是,在定義一種數組類型的時候,數組名一定要括起來,這種定義的方法可能和其他的typedef不大一樣。或許你還想知道,這樣的類型有什麼用,不要着急,後面會講到的,現在我們先把上面的問題完成了再說。

              既然明白了數組類型了,那我們就能夠明白爲什麼sizeof(array_int1) = 40 ,而 sizeof(&array_int1) = 4。這是因爲,變量array_int1是一種int [10]的數據類型,那麼&array_int1便是對這個變量求地址了,並且,在32位系統下,不管是內置類型還是自定義類型,對該類型的變量求地址後用sizeof() 運算符,得到的都是4。

          2、二維數組的定義和初始化

             二維數組的定義和初始化和一維數組類似,這裏不再多說。值得注意的有兩點:

             1)、任何數組初始化的時候不能初始化爲空;  int a[10];  a[10] = {};//這是錯誤的,因爲不能將數組指向一塊不存在的內存空間

             2)、在使用多維數組時,我們要把多維數組當做是數組的數組。

          3、二維數組的下標訪問以及二級指針的操作

           二維數組的下標操作符和一維數組的沒有區別,理解的時候需要記住,a[8] = *(a+8)。

          二維數組在上述基礎上,我們可以用多種方式來訪問二維數組了。

          

#include <iostream>
using namespace std;
#define PI 3.14
//初始化數組
void Init_Int_Array(int (*p)[4]);

void Init_Double_Array(double array[2][3]);

void Display_Int_Array(int (*array)[4]);

void Display_Double_Array(double array[][3]);


int main()
{
    int array_int[3][4];
    double array_double[2][3];

    int (*pint)[4] = array_int;
    double (*pdb)[3] = array_double;

    Init_Int_Array(pint);
    Init_Double_Array(pdb);
    Display_Int_Array(pint);
    Display_Double_Array(array_double);

    return 0;
}

void Init_Int_Array(int (*p)[4])
{
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<4;j++)
            p[i][j] = i*j;
    }
}

void Init_Double_Array(double array[2][3])
{
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<3;j++)
            *(*(array+i)+j) = PI*i*j;
    }
}

void Display_Int_Array(int (*array)[4])
{
    for(int i = 0;i<3;i++)
    {
         for(int j=0;j<4;j++)
         {
             cout<<array[i][j]<<" ";
         }
        cout<<endl;
    }


        cout<<endl;
}

void Display_Double_Array(double array[][3])
{
   for( int i = 0; i <2;i++)
    {
        for(int j=0;j<3;j++)
        {
            cout<<array[i][j]<<"  ";
        }
        cout<<endl;
    }

        cout<<endl;
}

以下是程序運行的結果:

          上述例子中提供了多種訪問二維數組的方法,整個程序如果詳細講解的話過於累贅,我只介紹一下二維數組的遍歷,其他地方如果還有什麼不懂的地方可以相互交流。

          1)、這種遍歷方式(     p[i][j] = i*j;   )想必大家都懂,

           2)、  *(*(array+i)+j) = PI*i*j;//主要是這種方式。

                      在一維數組中已經講了數組遍歷的兩種方式,(*a+6) = a[6];。還有一個就是二維數組中的每一行也是一個數組。

                     對於array[3][4]而言,每一個array[i]都是一個有四個元素構成的數組,而array[i]可以表示成  *(array +i),所以 array[i][j] 便可以表示成 *(*(array+i)+j)          

         初次接觸或是對指針等的瞭解不深的話可能對上述的操作有些疑問,下面我將數組做函數參數和指針之間的對應關係給大家講解一下:

          一維數組當然對應一維指針:

           int a[10] ;要將數組作爲實參,則形參中應該寫成這樣  int * p;

         二維數組需要二維指針:

           char ch[10][20];要將數組作爲實參,則形參中應該按照下面的方式來寫  ch (*pch)[20];//注意,形參中(*pch) 的括號不能少,[]中的數字必須要和實參中的對應

            至於還有的一種方法  char ch[][20]或是char ch[10][20],這樣寫並沒有錯,只是在程序書寫中顯得並不是特別的規範,所以儘量不要採用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章