C++中的數(shù)組

技術(shù)交流QQ群:1027579432,歡迎你的加入宝恶!

1.Cpp中的數(shù)組

  • C++支持數(shù)組數(shù)據(jù)結(jié)構(gòu)符隙,它可以存儲一個固定大小的相同類型的元素的順序集合。數(shù)組是用來存儲一系列數(shù)據(jù)垫毙,但它往往被認為是一系列相同類型的變量霹疫。數(shù)組的聲明并不是聲明一個個單獨的變量,如a0,a1,a2,a3,a4...,a99,而是聲明一個數(shù)組變量综芥,比如as,然后使用as[0],as[1],as[2],...,as[99]來代表一個個單獨的變量丽蝎,數(shù)組的特定元素可以通過索引來訪問。所數(shù)組都是由連續(xù)的內(nèi)存位置組成膀藐,最低的地址對應第一個元素屠阻,最高的地址對應最后一個元素。

2.聲明數(shù)組

  • 在C++在聲明一個數(shù)組额各,需要指定元素的類型和元素的數(shù)量国觉,如下所示:
    數(shù)據(jù)類型 數(shù)組名[元素數(shù)量];
    
  • 上面聲明的格式是一維數(shù)組的聲明,其中元素個數(shù)必須是一個大于0的整型常量虾啦,數(shù)據(jù)類型可以是任意有效的C++數(shù)據(jù)類型麻诀。如聲明一個類型為double的包含10個元素的數(shù)組balance,聲明語句是: double balance[10];

3.初始化數(shù)組

  • 在C++中缸逃,可以逐個初始化數(shù)組针饥,也可以使用一個初始化語句,如下所示:
    double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
    
  • 大括號{ }之間的值的數(shù)目不能大于在數(shù)組聲明時在方括號[ ]中指定的元素數(shù)目需频。
  • 如果省略掉了數(shù)組的大小,數(shù)組的大小則為初始化時元素的個數(shù)筷凤。因此昭殉,如果是下面的格式,將創(chuàng)建一個數(shù)組藐守,它與前一個實例中所創(chuàng)建的數(shù)組是完全相同的
    double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
    
  • 為數(shù)組中某個元素賦值的實例,下面的語句把數(shù)組中第五個元素的值賦為666.6挪丢。所有的數(shù)組都是以0作為它們第一個元素的索引,也被稱為基索引卢厂,數(shù)組的最后一個索引是數(shù)組的總大小減去1乾蓬。
    balance[4] = 666.6;
    

4.訪問數(shù)組元素

  • 數(shù)組元素可以通過數(shù)組名稱加索引進行訪問。元素的索引是放在方括號內(nèi)慎恒,跟在數(shù)組名稱的后邊任内。例如:
    double salary = balance[3];
    
  • 聲明數(shù)組撵渡、初始化數(shù)組、訪問數(shù)組元素實例如下:
        #include "iostream"
        #include "iomanip"
    
        using namespace std;
        using std::setw;   //  setw() 函數(shù)來格式化輸出
    
        int main(){
            int a[10];   // 聲明一個包含10個元素的整型數(shù)組
            // 初始化數(shù)組
            for (int i = 0; i < 10; i++)
                a[i] = i + 100;
            cout << "元素索引" << setw(13) << "元素值" << endl;
            // 輸出數(shù)組中的每個元素
            for (int j = 0; j < 10; j++)
                cout << setw(7) << j << setw(13) << a[j] << endl;
            return 0;
        }
    

5.與數(shù)組有關(guān)的概念

與數(shù)組有關(guān)的概念.png
  • 5.1 多維數(shù)組
  • C++支持多維數(shù)組死嗦。多維數(shù)組聲明的一般形式如下:
        數(shù)據(jù)類型名 數(shù)組名[size1][size2]...[sizeN];
    
  • 例如趋距,下面的聲明創(chuàng)建了一個三維整型數(shù)組:
        int tridim[5][10][4];
    
  • 二維數(shù)組
    • 多維數(shù)組最簡單的形式是二維數(shù)組。一個二維數(shù)組越除,在本質(zhì)上节腐,是一個一維數(shù)組的列表。聲明一個x行y列的二維整型數(shù)組摘盆,形式如下:
          數(shù)據(jù)類型 數(shù)組名[x][y];
      
    • 一個二維數(shù)組可以被認為是一個帶有x行和y列的表格翼雀。下面是一個二維數(shù)組,包含3行和4列:


      二維數(shù)組.png
    • 因此孩擂,數(shù)組中的每個元素是使用形式為a[i][j]的元素名稱來標識的锅纺,其中a是數(shù)組名稱,i和j 是唯一標識a中每個元素的下標肋殴。
    • 初始化二維數(shù)組
      • 多維數(shù)組可以通過在括號內(nèi)為每行指定值來進行初始化,下面是一個帶有3行4列的數(shù)組囤锉。
            int a[3][4] = {
                {0, 1, 2, 3},   /*  初始化索引號為 0 的行 */
                {4, 5, 6, 7},   /*  初始化索引號為 1 的行 */
                {8, 9, 10, 11}, /*  初始化索引號為 2 的行 */
            };
        
      • 內(nèi)部嵌套的括號是可選的,下面的初始化與上面是等同的:
          int a[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};  
        
    • 訪問二維數(shù)組元素
      • 二維數(shù)組中的元素是通過使用下標(即數(shù)組的行索引和列索引)來訪問的。例如:
            int val = a[2][3];
        
      • 二維數(shù)組如下:
             // 1.二維數(shù)組
            int aa[5][2] = {{0, 0}, {1, 2}, {2, 4}, {5, 7}, {9, 10}};
            for (int i = 0; i < 5; i++){
                for (int j = 0; j < 2; j++){
                    cout << "aa[" << i << "][" << j << "] = " << aa[i][j] << endl;
                }
            }
        
  • 5.2 指向數(shù)組的指針----數(shù)組指針
  • 數(shù)組名是一個指向數(shù)組中第一元素的常量指針(int const *p;),因此,double a[40];a是一個指向&a[0]的指針护锤,即數(shù)組a的第一個元素的地址官地。因此,下面的程序片段p賦值給a的第一個元素的地址:
        double *p;
        double a[10];
        p = a;
    
  • 使用數(shù)組名作為常量指針是合法的烙懦,因此*(a+4)是一種訪問a[4]數(shù)據(jù)的合法方式驱入。一旦把第一個元素的地址存儲在p中,就可以使用*p,*(p+1),*(p+2)等來訪問數(shù)組的元素氯析。
    // 2.指向數(shù)組的指針:數(shù)組指針
        double b[5] = {12.4, 3.1, 5.6, 0.8, 5.4};
        double *p;  // 一個指向double型的指針,可以存儲一個double類型變量的地址
        p = b;
        cout << "使用指針的數(shù)組值 " << endl;
        for (int i = 0; i < 5; i++)
            cout << "*(p + " << i << ") = " << *(p + i) << endl;
        cout << "使用b作為地址的數(shù)組值 " << endl;
        for (int i = 0; i < 5; i++)
            cout << "*(b + " << i << ") = " << *(b + i) << endl; 
    
  • C++中亏较,將char*或char[]傳給cout進行輸出,結(jié)果會是整個字符串掩缓,如果想要獲得字符串的地址(第一個字符的地址)雪情,可以使用方法:強制轉(zhuǎn)化為其他指針(非char),可以是void*, float*,int*,double*等。使用&s[0]不能輸出s[0]的地址,因為&s[0]將返回char*,對于char*,cout會將其作為字符串來處理你辣,向下查找字符并輸出直到字符結(jié)束*巡通。
    // C++中,將char*或char[]傳遞給cout進行輸出舍哄,結(jié)果會是整個字符串宴凉。如果想要獲得字符串的地址,強制轉(zhuǎn)化為其他指針(非char*)
        char var[MAX] = {'a', 'b', 'c'};
        char *ptr;
        // 指針中的數(shù)組地址
        ptr = var;
        for (int i = 0; i < 3; i++){
            cout << "var[" << i << "]的地址是 = " << (int *)ptr << endl;
            cout << "var[" << i << "] = " << *ptr << endl;
            ptr++;  // 移動到下一個位置
        }
    
  • 5.3 C++中傳遞數(shù)組給函數(shù)
  • C++中可以通過指定不帶索引的數(shù)組名來傳遞一個指向數(shù)組的指針
  • C++傳數(shù)組給一個函數(shù)表悬,數(shù)組類型自動轉(zhuǎn)換為指針類型弥锄,因此傳的實際是地址
  • 如果想在函數(shù)中傳遞一個一維數(shù)組作為參數(shù),必須用下面三種方式來聲明函數(shù)形式參數(shù),這三種聲明方式的結(jié)果是一樣的籽暇,因為每種方式都會告訴編譯器將要接收一個整型指針温治。同樣的,也可以傳遞一個多維數(shù)組作為形式參數(shù)图仓。
    • 方式1(形式參數(shù)是一個指針))
          void func1(int *param){
              ...
          }
      
    • 方式2(形式參數(shù)是一個已定義大小的數(shù)組))
          void func1(int params[10]){
              ...
          }
      
    • 方式3(形式參數(shù)是一個未定義大小的數(shù)組)
          void func1(int params[]){
              ...
          }
      
  • 實例如下:
    // 3.C++中把數(shù)組傳遞給函數(shù)(方法1)
        int bb[5] = {1000, 2, 3, 17, 50};
        double avg, avg1;
        // 傳遞一個指向數(shù)組的指針作為參數(shù)
        avg = getAverage(bb, 5);
        cout << "平均值: " << avg << endl;
        /*-----------------------方法2-----------------------*/
        int bbb[5] = {1000, 2, 3, 17, 50};
        int *ptr1 = bbb;
        // 分別計算數(shù)組元素個數(shù)罐盔,以及整型指針的字節(jié)數(shù)
        size_t bbb_size = sizeof(bbb) / sizeof(int);
        size_t ptr1_size = sizeof(ptr1);
        cout << "bbb size = " << bbb_size << endl;
        cout << "ptr1 size = " << ptr1_size << endl;
        avg1 = getAverage1(bbb, 5);
        cout << "平均值: " << avg1 << endl;
    
        // 方法1(下面的例子中把數(shù)組作為參數(shù),同時還傳遞了另一個參數(shù))
        double getAverage(int arr[], int size){
            int i, sum = 0;
            double avg;
            cout << "sizeof(arr) = " << sizeof(arr) << endl;
            for (i = 0; i < size; i++)
                sum += arr[i];
            avg = double(sum) / size;
            return avg;
        }
    
        // 方法2
        double getAverage1(int *arr, int size){
            int i, sum = 0;
            double avg;
            cout << "sizeof(arr) = " << sizeof(arr) << endl;
            for (i = 0; i < size; i++)
                sum += arr[i];
            avg = double(sum) / size;
            return avg;
        }
    
  • 5.4 從函數(shù)返回數(shù)組
  • C++不允許返回一個完整的數(shù)組作為函數(shù)的參數(shù)救崔。但是惶看,可以通過指定不帶索引的數(shù)組名來返回一個指向數(shù)組的指針。C++不支持在函數(shù)外返回局部變量的地址六孵,除非定義局部變量為static變量纬黎。如果想要從函數(shù)返回一個一維數(shù)組,必須聲明一個返回指針的函數(shù)(指針函數(shù))劫窒,如下:
        int * func(){
            ...
        }
    
  • 實例如下:
        // 要生成和返回隨機數(shù)的函數(shù)
        int * getRandom(){
            static int r[10];  // C++不支持在函數(shù)外返回局部變量的地址本今,除非定義局部變量為static變量
            // 設(shè)置隨機數(shù)種子
            srand((unsigned)time(NULL));
            for (int i = 0; i < 10; i++){
                r[i] = rand();
                cout << "r[" << i << "] = " << r[i] << endl;
            }
            return r;
        }
        // 4.從函數(shù)返回數(shù)組----指針函數(shù)
            int *p1; 
            p1 = getRandom();
            for (int i = 0; i < 10; i++)
                cout << "*( p1 + " << i << ") = " << *(p1 + i) << endl;
    

6.數(shù)組中的細節(jié)知識

  • 直接初始化字符數(shù)組char是特殊的,這種初始化需要一個null作為結(jié)尾的主巍。如下:
        char a1[] = {'p', 'y', 't', 'h', 'o', 'n'};  // 初始化冠息,沒有 null
        char a2[] = {'p', 'y', 't', 'h', 'o', 'n', '\0'};   // 初始化,明確有 null
        char a3[] = "python";  // null 終止符自動添加
        const char a4[6] = "python";  // 報錯孕索,沒有 null 的位置
    
  • 數(shù)組的大小是固定的逛艰,不能額外增加元素,當想定義不固定大小的字符時搞旭,使用vector散怖!
        vector<int> vec;  // 創(chuàng)建向量用于存儲整型數(shù)據(jù)
        int m;
        // 顯示vec初始大小
        cout << "vector size = " << vec.size() << endl;
        // 向向量vec追加5個整數(shù)值
        for(int m = 0; m < 5; m++)
            vec.push_back(m);
        // 顯示追加后vec的大小
        cout << "追加后的vector size = " << vec.size() << endl;
    
  • 在C++中,setw(int n)用來控制輸出間隔肄渗,(n-1個空格),setw()默認填充的內(nèi)容是空格镇眷,可以使用setfill()配合使用設(shè)置其他字符填充。
cout << setfill('*') << setw(5) << 'a' << endl;
  • 靜態(tài)與動態(tài)數(shù)組
        靜態(tài) int array[100];  定義了數(shù)組 array翎嫡,并未對數(shù)組進行初始化
            int array[100] = {1, 2};  定義并初始化了數(shù)組 array
    
        動態(tài) int * array = new int[100];  分配了長度為 100 的數(shù)組 array
            delete [] array;
    
        動態(tài) int * array = new int[100]{1, 2};  為長度為100的數(shù)組array初始化前兩個元素
            delete [] array;
    
  • 數(shù)組初始化時可以用聚合方法欠动,但是賦值時候不可以用聚合方法。舉例如下:
        int array[] = {5,10,20,40};   // 合法
    
        int array[];
        int main()
        {
        array[] = {5,10,20,40}; // 不合法
        return 0;
        }
    
  • 數(shù)組在使用時可以是一個含有變量的表達式钝的,但是翁垂,在數(shù)組聲明時必須用常量表達式硝桩。例如:
        // 合法
        const int a=19;
        long b[a];
    
        // 合法
        const int a=19;
        long b[a+5];
    
        // 不合法
        int a=19;
        long b[a+5];
    
  • 聲明一個任意長度的數(shù)組,可以用顯式的類型轉(zhuǎn)換枚荣,例如:
        int a=19;
        int b[(const int)a];
    
  • 也可以定義一個常量來聲明,例如:
        int a=19;
        const int a1=a;
        int b[a1];
    
  • Vector(向量): C++中的一種數(shù)據(jù)結(jié)構(gòu)碗脊,確切的說是一個類。它相當于一個動態(tài)的數(shù)組,當程序員無法知道自己需要的數(shù)組的規(guī)模多大時衙伶,用其來解決問題可以達到最大節(jié)約空間的目的祈坠。
    • 用法:
      • 1.文件包含:
        • 首先在程序開頭處加上 #include<vector> 以包含所需要的類文件vector;還有一定要加上 using namespace std;
      • 2.變量聲明:
        • 2.1例: 聲明一個 int 向量以替代一維的數(shù)組: vector <int> a; (等于聲明了一個 int 數(shù)組 a[],大小沒有指定矢劲,可以動態(tài)的向里面添加刪除)赦拘。
        • 2.2例: 用vector代替二維數(shù)組.其實只要聲明一個一維數(shù)組向量即可,而一個數(shù)組的名字其實代表的是它的首地址,所以只要聲明一個地址的向量即可芬沉,即: vector <int *> a躺同。同理想用向量代替三維數(shù)組也是一樣,vector <int**>a;
      • 3.具體的用法以及函數(shù)調(diào)用:
        • 3.1 得到向量中的元素和數(shù)組一樣丸逸,例如:
              vector <int *> a
              int b = 5;
              a.push_back(b);//該函數(shù)下面有詳解
              cout << a[0];       //輸出結(jié)果為5
          
        • 使用數(shù)組給向量賦值:
              vector<int> v( a, a+sizeof(a)/sizeof(a[0]) );
          
        • 或者:
              int a[]={1,2,3,4,5,6,7,8,9};
              typedef vector<int> vec_int;
              vec_int vecArray(a,a+9);
          
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹋艺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子黄刚,更是在濱河造成了極大的恐慌捎谨,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憔维,死亡現(xiàn)場離奇詭異涛救,居然都是意外死亡,警方通過查閱死者的電腦和手機业扒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門检吆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凶赁,你說我怎么就攤上這事咧栗。” “怎么了虱肄?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵致板,是天一觀的道長。 經(jīng)常有香客問我咏窿,道長斟或,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任集嵌,我火速辦了婚禮萝挤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘根欧。我一直安慰自己怜珍,他們只是感情好,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布凤粗。 她就那樣靜靜地躺著酥泛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柔袁,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天呆躲,我揣著相機與錄音,去河邊找鬼捶索。 笑死插掂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的腥例。 我是一名探鬼主播辅甥,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼院崇!你這毒婦竟也來了肆氓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤底瓣,失蹤者是張志新(化名)和其女友劉穎谢揪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捐凭,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡拨扶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了茁肠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片患民。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖垦梆,靈堂內(nèi)的尸體忽然破棺而出匹颤,到底是詐尸還是另有隱情,我是刑警寧澤托猩,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布印蓖,位于F島的核電站,受9級特大地震影響京腥,放射性物質(zhì)發(fā)生泄漏赦肃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一公浪、第九天 我趴在偏房一處隱蔽的房頂上張望他宛。 院中可真熱鬧,春花似錦欠气、人聲如沸厅各。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讯检。三九已至琐鲁,卻和暖如春卫旱,著一層夾襖步出監(jiān)牢的瞬間人灼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工顾翼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留投放,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓适贸,卻偏偏與公主長得像灸芳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拜姿,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348