C++教程第三章-數組

來源:互聯網
上載者:User

標籤:c++   教程   快速入門   

轉載請註明出處:

http://blog.csdn.net/miaoyunzexiaobao

 

PS:命名空間的概念:之前寫的std::cout/std::cin/std::endl等,表示cout/cin/endl這些屬於一個名為std的命名空間,不願寫的話可以在main之前聲明:using namespace std,表明本函數使用命名空間std。命名空間的概念會在以後講解。

1.      數組的概念

數組是一群組類型的值的集合,是由類型名,標識符和維數組成的複合資料型別。其中類型名規定了數組可儲存的類型,維數指定了數組中包含的元素的個數。

比如說定義一個長度為10的整型數組:int a[10];

2.      數組的初始化

數組的下標從0開始。也就是說一個長度為3的數組int a[3],其中的元素為a[0],a[1],a[2]。

定義數組後,若不對其初始化,則數組會根據其類型的預設初始化規則對數組內的元素初始化。執行個體如下:

Code:

#include <iostream> using namespace std; int a_Global[10];bool b_Global[10]; int _tmain(int argc,_TCHAR* argv[]){    int a[10];    bool b[10];    cout<<"a[10]:";    for(int i = 0 ; i < 10; ++i)        cout<<a[i]<<" ";    cout<<endl<<"a_Global[10]:";    for(int i = 0 ; i < 10; ++i)        cout<<a_Global[i]<<" ";    cout<<endl<<"b[10]:";    for(int i = 0 ; i < 10; ++i)        cout<<b[i]<<" ";    cout<<endl<<"b_Global[10]:";    for(int i = 0 ; i < 10; ++i)        cout<<b_Global[i]<<" ";     return 0;}


,定義在函數外的a_Global和b_Global中各元素均被初始化為0,而定義在函數內的數組中各值則未定義。

當對數組的第一個值進行初始化後,若未初始化數組的其他元素,則數組中的其他元素會初始化為0:

int _tmain(int argc,_TCHAR* argv[]){    int a[10] ={3};    bool b[10] ={4};    cout<<"a[10]:";    for(int i = 0 ; i < 10; ++i)        cout<<a[i]<<" ";    cout<<endl<<"b[10]:";    for(int i = 0 ; i < 10; ++i)        cout<<b[i]<<" ";    return 0;}


注意b是bool型數組,將4賦給b[0]時,b[0]變為true。當輸出b[0]時,bool轉int,true轉為1,即輸出1


顯示初始化數組:即在定義數組時設定其元素。顯示初始化時,可以不指定數組維數。比如:int a[]={1,2,3},即定義了一個長度為3的數組,並將其中的三個元素賦值為1,2,3。

另外,數組不允許直接賦值和複製。即不能將一個數組複製給另一個數組,或給另一個數組賦值。

3.      多維陣列

之前說的是一維數組,現在看一下二維的:int a[3][3];

二維數組類似於一維數組,看一個執行個體就明白了:

int _tmain(int argc,_TCHAR* argv[]){    int a[3][2]= {{1,2},{3,4},{5,6}};     for(int i = 0 ; i < 3 ; ++i)        for(int j = 0 ; j < 2 ; ++j)            cout<<a[i][j]<<" ";    cout<<endl;     return 0;}


多維陣列中第一維的數字可以省略,系統能根據用於初始化數組的元素個數推算出第一維的大小:int a[][2] = {{1,2},{3,4},{5,6}};,系統會將第一維的大小設為3。

其實可以看到,二維數組就是由多個一維數組組成的。電腦中其實並沒有多維陣列的概念,程式中設定的多維陣列,在電腦底層將自動轉化為一維數組。

4.      數組名

現在已經知道在使用一個數組時,可通過數組名+下標的形式進行調用。但是當直接輸出數組名時,會是什麼效果?


可以看到在直接列印a和a+1時,系統列印出了兩個十六進位的數。其實在定義一個數組時,系統就為該數組在記憶體中開闢了一塊空間。其中數組名就代表了該空間的地址。因此,列印a時,即列印數組a[10]的第一個數a[0]的地址。列印a+1時,即列印第二個數a[1]的地址。


這裡在介紹一個知識點:解引用符“*”。當對一個地址使用解引用符,表示擷取該地址指向的值:


即:


也就是說a[0] == *a , a[1] == *(a+1) … a[9] == *(a+9)

再試試二維數組:


在這裡a仍代表數組地址。可是a[0]是什麼呢?之前有提到,二維數組其實就是多個一維數組的組合。這裡的a[2][3],實際上就是由兩個維數為3的一維數組組成的。因此,a[0]應該是第一個一維數組的地址,a[1]應該是第二個一維數組的地址。那麼如何獲得第一個一維數組中的第一個數?仍然是對其做解引用。因此有:a[0][0] == **a , a[1][0] = **(a+1)。同理,a[0][1] == *(*(a)+1) , a[1][1] == *(*(a+1)+1)…

5.      數組長度

若數組下標越界,則系統會產生錯誤。也不能將超過數組長度的數初始化數組。比如:
int a[3]={1,2,3,4};會產生編譯錯誤。

這裡順便提一下C++中的字串。比如“HELLO”,這個字串長度為6.在HELLO之後系統還加了一個隱藏的’\0’:


sizeof和strlen簡介:(引自百度百科)

sizeof是C/C++中的一個操作符(operator),簡單的說其作用就是返回一個對象或者類型所佔的記憶體位元組數

strlen所作的僅僅是一個計數器的工作,它從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體地區)開始掃描,直到碰到第一個字串結束符‘\0‘為止,然後返回計數器值(長度不包含“\0”)。

因此,若做如下操作:

char a[5] = “HELLO”也是錯誤的。應設為6.

至於為什麼字串後面會有個’\0’,是因為C++為相容C。在C語言中,用char*或char數組表示字串,其對字串的操作,均約定以讀取到’\0’為終止。比如C語言中的strlen,strcmp,strXXX等。學過C的同學應該會有印象。

C++中不再用C中的char*表示字串,而是用string表示。關於string,將在之後講解。

C++教程第三章-數組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.