天天看點

C++基礎---指針數組與數組指針1. 指針數組與數組指針

1. 指針數組與數組指針

1.1 指針數組的定義

  • 指針數組:是數組元素為指針的數組,本質為數組;
  • 指針數組:每一個元素均為指針,即有諸形如“*ptr_array[i]”的指針。

    注:由于數組元素均為指針,是以ptr_array[i]是指第i+1個元素的指針。

  • 指針數組的定義形式為:類型名 *數組辨別符[常量表達式];

    如:int *a[4];//指針數組

    表示:數組a中的元素都為int型指針

    元素表示:* a[i]跟* (a[i])是一樣的,因為[]優先級高于*

1.2 指針數組的應用

  • 指針數組:可以作為函數的參量使用,使用方式與普通數組類似。
  • 指針數組:常适用于指向若幹字元串,這樣使字元串處理更加靈活友善。
    #include<iostream>
    
    using namespace std;
    int main()
    {
        char *p[] = {"h", "e", "l", "l", "o"};
        for(int i=; i<; i++)
        {
            cout<<p[i]<<"\t";
        }
        cout<<endl;
        for(int i=; i>=; i--)
        {
            int x = i+;
            p[i] = (char*)(&x);
            cout<<p[i]<<"\t";
        }
        cout<<endl;
        system("pause");
        return ;
    }
    =>h       e       l       l       o
      E       D       C       B       A
               

1.3 指針數組與二維數組

  • 二維數組:如char string_1[10][10]隻要定義了一個二維數組,無論賦不指派,系統都會給他配置設定相應空間,而且該空間一定是連續的。其每個元素表示一個字元。我們可以通過指定下标對其元素進行修改。
  • 指針數組:如char *str_B[5] 系統至少會配置設定5個連續的空間用來存儲5個元素,表示str_B是一個5個元素的數組,每個元素是一個指向字元型資料的一個指針。以下定義: 他們在記憶體的存儲方式分别如下圖所示,可見,系統給數組c配置設定了4×8的空間,而給p配置設定的空間則取決于具體字元串的長度。此外,系統配置設定給a的空間是連續的,而給n配置設定的空間則不一定連續。
    char c[][]={"my","name","is","Mini"};//二維數組的定義
    char *p[]={"my","name","is","Mini"};  //指針數組的定義
               
    C++基礎---指針數組與數組指針1. 指針數組與數組指針
    注:由此可見,相比于比二維字元數組,指針數組有明顯的優點:一是指針數組中每個元素所指的字元串不必限制在相同的字元長度;二是通路指針數組中的一個元素是用指針間接進行的,效率比下标方式要高。 但是二維字元數組卻可以通過下标很友善的修改某一進制素的值,而指針數組卻無法這麼做。

1.4 數組指針的定義

  • 數組指針:指向數組首元素的位址的指針,本質為指針,(這個指針存放的是數組首位址的位址,相當于2級指針,這個指針不可移動);
  • 數組指針:存放的是數組首位址的位址,相當于2級指針,這個指針不可移動;
  • 數組指針的定義形式為:類型名 (*數組辨別符)[常量表達式];

    如:int (*a)[4];//數組指針

    表示:指向數組a的指針

    元素表示:(*a)[i];

1.5 數組指針的應用

  • 代碼示例:
    #include<iostream>
    
    using namespace std;
    int main()
    {
        char c[][] = {"h", "e", "l", "l", "o", "o"};
        char (*p)[] = c;
        for(int i=;i<=;i++)
        {
             cout<<*(p+i)<<"\t";
        }
        cout<<endl;
        for(int i=; i>=; i--)
        {
            //(*p)[i] = "X";//編譯報錯,error C2440: “=”: 無法從“const char [2]”轉換為“char”
            cout<<*(p+i)<<"\t";
        }
        cout<<endl;
        system("pause");
        return ;
    }
    =>h       e       l       l       o       o
      o       o       l       l       e       h
               

1.6 指針數組與數組指針的程式對比

  • 代碼示例:
    #include <iostream>
    
    using namespace std; 
    int main()
    {
        int c[]={,,,};
        int *a[];//指針數組
        int (*b)[];//數組指針
        b=&c;
    
        //将數組c中元素賦給數組a
        for(int i=;i<;i++)
        {
            a[i]=&c[i];
        }
    
        cout<<*a[]<<endl;   //輸出2就對
        cout<<(*b)[]<<endl; //輸出3就對
    
        system("pause");
        return ;
    }
    =>
      
               

    注:定義了數組指針,該指針指向這個數組的首位址,必須給指針指定一個位址,容易犯的錯得就是,不給b位址,直接用(*b)[i]=c[i]給數組b中元素指派,這時數組指針不知道指向哪裡,調試時可能沒錯,但運作時肯定出現問題,使用指針時要注意這個問題。但為什麼a就不用給他位址呢,a的元素是指針,實際上for循環内已經給數組a中元素指定位址了。但若在for循環内寫*a[i]=c[i],這同樣會出問題。

    總之一句話,定義了指針一定要知道指針指向哪裡,不然要悲劇。

參考文獻:

[1]《C++全方位學習》範磊——第十四章

[2]《C++程式設計教程(第二版)》錢能——第三章

[3]《C++Primer(中文版)》王剛、楊巨峰——第三章

[4] 百度搜尋關鍵字:C++數組、指針數組、數組指針