1. 程式人生 > >C++中的陣列問題

C++中的陣列問題

和C語言一樣,C++中也存在陣列,而且用法也與C語言中的一樣。

  • 陣列的定義:和C語言中的一樣,定義一個數組需要指定其大小和型別,但注意,陣列的定義不能出現未知長度或長度為變數的情況,如:
int a[5];  //定義一個長度為5的整形類的陣列,即該陣列中可存放5個整形數
int a[];  //產生編譯錯誤,陣列a的長度未知
int i;
int a[i]; //產生邏輯錯誤,因為i是未知數
//但是如下定義是合法的,但會產生警告:
int j;
cin >>j;  //從鍵盤中輸入j的值
int b[j]; //此處會出現警告“unused variable 'b'[-Wunused-variable]”
  • 陣列的賦值:陣列即可以一一賦值,也可以同時賦值,還可以通過for或while迴圈來賦值,例如:
int a[] = {1, 2, 3, 4, 5} //定義的同時賦值,這時a的大小可以不寫,編譯器會根據後面資料的個數來預設a的長度,此處為5
int b[4];  //一一賦值
b[0] = 1;  //注意,陣列的第一個資料一定是從0開始到長度-1
b[1] = 2;
b[2] = 3;
b[3] = 4;
int c[100];
for(int i = 0; i < 100; i++)
    c[i] = i;   //採用for迴圈賦值,這裡的i不再是變數,因為在for迴圈中,每次迴圈i都有一個具體的值
  • 陣列的輸出問題:若要輸出陣列中的全部內容,可以採用一一輸出,也可用for或while迴圈輸出,例如:
int b[2] = {1, 2};
cout << b[0];
cout << b[1];   //一一輸出
int c[100];
for(int i = 0; i < 100; i++)
    c[i] = i; 
for(int i = 0; i < 100; i++)
    cout << c[i] << "\t";  //採用for迴圈輸出
  • 賦值與輸出,如果一個數組的長度為5,但賦值的只有2個,若全部輸出,則剩下的3個數輸出任意數字,例如:
int a[5];
a[0] = 5;
for(int i = 0; i < 5; i++)
    cout << a[i] << endl;

輸出結果:

但若採用同時賦值的方法,則其他的預設為0:

int a[5] = {5};
for(int i = 0; i < 5; i++)
    cout << a[i] << endl;

輸出結果:

  • 陣列所佔空間:如果陣列只是定義,並沒有初始化(賦值),那麼該陣列所佔的空間只是首地址的空間,但如果初始化了(賦值了),則該陣列所佔空間為長度×陣列型別所佔空間,不論是否全部賦值:例如:
int a[5];
cout << sizeof(a);  //輸出4,因為首元素為int型4位元組
a[0] = 5;
cout << sizeof(a);  //輸出20,因為此時已經初始化了,雖然只給了1個數據,但其大小已經是5×4
char b[5];
cout << sizeof(b);  //輸出1
b[0] = 'a'; 
cout << sizeof(b);  //輸出5
  • 二維陣列和多維陣列:二維陣列相當於是一個矩陣,分為行和列,其定義與賦值同一維陣列,例如:
int a[2][3];   //定義一個兩行三列的“矩陣”
a[0][0] = 1;
a[0][1] = 2;
a[0][2] = 3;   //先給第一行賦值
//……再給第二行賦值
int b[2][3] = {1, 2, 3, 4, 5, 6}; //直接同時賦值
//int b[][] = {1, 2, 3, 4, 5, 6};   非法,會產生編譯錯誤,因為編譯系統不知道有多少行或多少列
//int c[2][] = {1, 2, 3, 4, 5, 6};  非法,因為已經給定了行,但列未給出
//int d[][3] = {1, 2, 3, 4, 5, 6};  非法,因為已經給定了列,但行未給出
//int e[][] = {{1, 2, 3}, {4, 5, 6}}; 非法
//還可以採用for或while迴圈賦值,只是這時需要使用兩次:
int f[2][3];
for(int i = 0; i < 2; i++){   //控制行迴圈
    for(int j = 0; j < 3; j++){ //控制列迴圈
        f[i][j] = i + j;  //賦值
    }
}

同樣地,輸出也可以採用同樣地方法。下面就可以利用二維陣列來輸出一些矩陣了,例如:請寫一個程式要求設定一個矩陣,要求交換其行和列地位置,程式碼如下:

#include <iostream>
using namespace std;
int main(){
    int array[4][4];
    for(int i = 0; i < 4; i++)  //採用for迴圈給4×4矩陣賦值
        for(int j = 0; j < 4; j++)
            array[i][j] = i * j + j;
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < 4; j++)
            cout << array[i][j] << "\t"; //輸出,每個數之間加一個tab
        cout << endl;   //每行之間換一行,看起來比較舒服
    }
    int flag;   //設定一箇中間變數用以交換
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < i; j++){  //控制迴圈,列小於行即可,避免再次交換回來
            flag = array[i][j];
            array[i][j] = array[j][i];
            array[j][i] = flag;   //交換
        }
    }
    cout << "----------交換後----------" <<endl;  //再次輸出
        for(int i = 0; i < 4; i++){
        for(int j = 0; j < 4; j++)
            cout << array[i][j] << "\t";
        cout << endl;
    }
    return 0;
}

輸出結果:

如有錯誤,歡迎大家批評與指正!