標籤: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++教程第三章-數組