[C++]陣列

丫就是熊個貓貓發表於2016-11-29

陣列

一維陣列的定義和引用

陣列是同一型別的一組值(10個 char 或15個 int) ,在記憶體中順序存放。

整個陣列共用一個名字,而其中的每一項又稱為一個元素。

一、定義方式:

 

其元素分別為:a[0], a[1], a[2], a[3]

      其序號從0開始。若存放首地址為2000H,則在記憶體中為:

 

C++不允許對陣列的大小作動態的定義,即陣列的大小不能是變數,必須是常量。

 

如果要根據不同的數值改變陣列的大小,可用常量表示式。如:

#define  SIZE   50

void main(void)

{   int   art[SIZE];

     ......

}

二、一維陣列元素的引用

陣列必須先定義,具體引用時(賦值、運算、輸出)其元素等同於變數。

 

三、一維陣列的初始化

在定義陣列的同時給陣列元素賦值。

注意:

1、對陣列中的一部分元素列舉初值,未賦值的部分是0。

int  a[10]= {0,1, 2, 3, 4, 5};

int  a[10]= {0,1, 2, 3, 4, 5, 0, 0, 0, 0};

2、不能給陣列整體賦值,只能一個一個地賦值。  

int  a[10]= {0,1,2,.....,9};

int  a[10]= {0,1, 2, 3, 4, 5,6,7,8,9};

3、可以用   int  a[ ]= {0,1, 2, 3, 4, 5, 6, 7, 8, 9};   給陣列賦值,編譯器會自動計算出內的元素項數,並將陣列定義為該長度。

4、用區域性static 或全域性定義的陣列不賦初值,系統均預設其為‘\0’。

static  int  a[10];(即儲存在靜態資料區中的陣列其元素預設為0)

 

陣列在記憶體中順序存放,第一個元素位於地址的最低端。

 

二維陣列的定義和引用

一、定義方式:

  型別說明符    陣列名[常量表示式][常量表示式];

 

其元素分別為:a[0][0], a[0][1], a[0][2], a[0][3],

a[1][0], a[1][1],   a[1][2], a[1][3],

 a[2][0], a[2][1], a[2][2], a[2][3]

其行列的序號均從0開始。若存放首地址為2000H,則在記憶體中為:

 

即在記憶體中,多維陣列依然是直線順序排列的,第一個元素位於最低地址處。

二、二維陣列的引用

與一維陣列一樣,二維陣列必須先定義,其維數必須是常量。具體引用時(賦值、運算、輸出)其元素等同於變數。

三、二維陣列的初始化

在定義陣列的同時給陣列元素賦值。即在編譯階段給陣列所在的記憶體賦值。

1、分行賦值

int  a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

2、順序賦值

int  a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; //依次賦值

3、部分賦值

int  a[3][4]={{1},{5},{9}};

    /* a[0][0]=1, a[1][0]=5, a[2][0]=9  其餘元素為0 */

4、分行或全部賦值時,可以省略第一維,第二維不可省。

int  a[ ][4]={{1,2},{5,6,7,8,}{9,10,11,12}};

5、不能給陣列整體賦值,只能一個一個地賦值。    

int  a[2][3]={1,2,3,.....,12};

6、用static 定義的陣列不賦初值,系統均預設其為‘\0’。

static  int  a[2][3];

 

陣列作為函式引數

一、陣列元素作函式引數

陣列元素作函式實參,用法與一般變數作實參相同,是“值傳遞”。

二、用陣列名作函式引數

在C++中,陣列名被認為是陣列在記憶體中存放的首地址。

用陣列名作函式引數,實參與形參都應用陣列名。這時,函式傳遞的是陣列在記憶體中的地址。

實參中的陣列地址傳到形參中,實參形參共用同一段記憶體。

注意:

1、用陣列名作函式引數,應在主調函式和被調函式中分別定義陣列,且型別一致。

2、需指定實引數組大小,形引數組的大小可不指定。陣列名作實參實際上是傳遞陣列的首地址。

3、C++語言規定,陣列名代表陣列在記憶體中儲存的首地址,這樣,陣列名作函式實參,實際上傳遞的是陣列在記憶體中的首地址。實參和形參共佔一段記憶體單元,形引數組中的值發生變化,也相當於實引數組中的值發生變化。

 

用多維陣列名作函式引數

同樣,實參向形參傳遞的是陣列的首地址。

如果實參、形參是二維陣列,則形參可以省略第一維,不可省略第二維,且第二維必須與實參中的維數相等。

 

字元陣列

用來存放字元資料的陣列是字元陣列,字元陣列中的一個元素存放一個字元。

一、字元陣列的定義

 

二、字元陣列的初始化

與數值陣列的初始化相同,取其相應字元的ASCII值。

char  c[10]={‘I’, ‘ ’, ‘a’, ‘m’, ‘ ’, ‘a’, ‘ ’ , ‘b’, ‘o’, ‘y’};  

 

char   st1[ ]={65, 66, 68};

 

如果字元個數大於陣列長度,做錯誤處理;如果數值個數小於陣列長度,後面的位元組全部為‘\0’。

如果省略陣列長度,則字元數即為陣列長度。

static   char  c[ ]={‘I’, ‘ ’, ‘a’, ‘m’, ‘ ’, ‘a’, ‘ ’ , ‘g’, ‘i’, ‘r’,’l’};

同理,也可定義和初始化一個二維或多維的字元陣列。分層或省略最後一維。

 

三、字元陣列的引用

void main(void)

{ char  c[10]={‘I’, ‘ ’, ‘a’, ‘m’, ‘ ’, ‘a’, ‘ ’ , ‘b’, ‘o’, ‘y’};  

        int  i;

        for (i=0; i<10; i++)

              cout<<c[i];

         cout<<“\n”;

}

 

四、字串和字串結束標誌

C++語言將字串作為字元陣列來處理。

字串常量:“CHINA”,在機內被處理成一個無名的字元型一維陣列。

 

C++語言中約定用‘\0’作為字串的結束標誌,它佔記憶體空間,但不計入串長度。有了結束標誌‘\0’後,程式往往依據它判斷字串是否結束,而不是根據定義時設定的長度。

 

字串與字元陣列的區別:

字元陣列:

char  a[ ]={‘C’,’H’,’I’,’N’,’A’};

 

字串:

char  c[ ]=“CHINA”;  

 

可以用字串的形式為字元陣列賦初值

char  c[ ]={“I am a boy”};  /*長度11位元組,以‘\0’結尾  

char  a[ ]={‘I’, ‘ ’, ‘a’, ‘m’, ‘ ’, ‘a’, ‘ ’ , ‘b’, ‘o’, ‘y’};

                   /* 長度10位元組  */

如果陣列定義的長度大於字串的長度,後面均為‘\0’。

char  c[10]=“CHINA”;  

 

‘\0’的ASCII為0,而‘ ’(空格)的ASCII為32。

 

字元陣列的輸入輸出

逐個字元的輸入輸出。這種輸入輸出的方法,通常是使用迴圈語句來實現的。如:

char  str[10];

cout<<“輸入十個字元:”;

for(int i=0;i<10;i++)

      cin>>str[i];//A

               ......

A行將輸入的十個字元依次送給陣列str中的各個元素。

 

·把字元陣列作為字串輸入輸出。對於一維字元陣列的輸入,在cin中僅給出陣列名;輸

  出時,在cout中也只給出陣列名。

·當要把輸入的一行作為一個字串送到字元陣列中時,則要使用函式cin.getline( )。這個

  函式的第一個引數為字元陣列名,第二個引數為允許輸入的最大字元個數。

 

六、字串處理函式

C++中沒有對字串變數進行賦值、合併、比較的運算子,但提供了許多字串處理函式,使用者可以呼叫  #include “string.h”

所有字串處理函式的實參都是字元陣列名

1、合併兩個字串的函式  strcat (str1, str2)

 

將第二個字串 str2 接到第一個字串 str1 後。

注意:第一個字串要有足夠的空間。

2、複製兩個字串的函式  strcpy (str1, str2)

static  char  str1[20]={“I am a ”};

static  char  str2[ ]={“boy”};

strcpy (str1, str2);

 

3、比較兩個字串的函式  strcmp (str1, str2)

此函式用來比較str1和str2中字串的內容。函式對字串中的ASCII字元逐個兩兩比較,直到遇到不同字元或‘\0’為止。函式值由兩個對應字元相減而得。

該函式具有返回值,返回值是兩字串對應的第一個不同的ASCII碼的差值。

若兩個字串完全相同,函式值為0。

4、求字串長度的函式  strlen (str1)

函式引數為陣列名,返回值為陣列首字母到‘\0’的長度。並非陣列在記憶體中空間的大小。

5、 strlwr (str1)

將str1中的大寫字母轉換成小寫字母。

6、 strupr (str1)

將str1中的小寫字母轉換成大寫字母。

7、函式strncmp(字串1,字串2 , maxlen)

函式原型為:

int  strncmp(char str1[ ], char str2[ ],int m)

第三個引數為正整數,它限定了至多比較的字元個數

若字串1或字串2的長度小於maxlen的值時,函式的功能與strcmp( )相同。

當二個字串的長度均大於maxlen的值時,maxlen為至多要比較的字元個數。

cout<<strncmp(“China”,“Chifjsl;kf”,3)<<‘\n’;

8、函式strncpy(字元陣列名1, 字串2, maxlen)

函式原型為:

 void strncmp(char str1[ ], char str2[ ],int m)

第三個引數為正整數,它限定了至多拷貝的字元個數

若字串2的長度小於maxlen的值時,函式的功能與strcpy( )相同。

當字串2的長度大於maxlen的值時,maxlen為至多要拷貝的字元個數。

 

 

除錯程式的方法:

1)單步除錯:以行為單位,每執行一步,程式就會中斷,可以實時查詢目前各變數的狀態及程式的走向。可以選擇是否進入子函式。

2)執行到游標處,可以直接使程式執行到游標處再進行單步除錯,這種方法可以不必執行正確的迴圈而直接到有疑問的地方。

相關文章