c++學習筆記系列:http://blog.csdn.net/column/details/17301.html
1、初始化
int n[10] = {1} 當初始化值比數組元素少的時候,剩下的元素被初始化爲0。int n[2] = {1, 2, 3} 當初始值比數組元素多的時候,編譯時會報錯。
static int n[10] 不必進行初始化,static數組會自動初始化元素。
2、聲明數組
只能使用常量來聲明數組,否則會產生編譯錯誤。如:int a = 10;
int n[a];
這樣就會產生編譯錯誤。
const int i = a;
int n[i];
這樣雖然i是用const修飾,但是賦值給他的a依然是一個變量,所以一樣會產生編譯錯誤。
尤其注意函數的傳參,用傳參來聲明數組會產生編譯錯誤。
int n[i];
這樣就不會產生編譯錯誤。
3、數組越界
與Java不同,在c++中數組越界不會報錯,編譯通過也可以正常運行,會得到一個默認值。但是數組越界是很嚴重的。雙向越界都不會報錯,也就是說下標爲負值也不會報錯。
4、數組賦值
數組是不能直接賦值的。如:int n[1] = {0};
int m[1] = {0};
n = m;
這樣就好編譯錯誤
由於數組名是const指針,所以一個數組不能通過賦值運算賦給另一個數組。(常量指針不能用在賦值運算左側)
5、數組/vector長度
(1)與java不同,數組不能知道自身的長度。所以把一個數組當函數傳參時,也要把數組長度當函數傳參才行。如:void init(int nums[], int length)
(2)vector.size()是一個size_t類型的,不是int類型,一定要注意。在某些編譯器上直接轉int會報錯。
6、vector初始化及賦值
(1)vector初始化可以傳入另外一個vector2,這樣會拷貝vector2的數據來初始化,稱爲拷貝構造函數。如:vector<int> a;
vector<int> b(a);
(2)將一個vector賦值給另外一個vector時,也是拷貝。
a = b; //a是b的拷貝,依然是兩個不同的vector。
注意當兩個vector不同時進行賦值,左側的vector無論之前什麼長度,都會變成跟右側vector長度相等,元素相等。
7、vector獲取元素
可以用vector[i]或vector.at(i)兩種形式來獲取元素。其中第一種方式與數組一樣不檢查邊界,而第二種方式會檢查邊界。8、函數傳參
數組作爲函數傳參時是引用參數,如void init(int a[])vector作爲函數傳參時默認是傳值的,所以如果想引用傳參,必須加“&”,如void init(vector &a)。
所以使用vector函數傳參時一定要注意,儘量使用引用傳參,以免不必要的內存佔用。
9、字符串數組
可以直接使用字符串初始化,如:char a[] = "abcd";
數組長度會比字符串長度大1,因爲數組末尾有一個‘\0’,來表示這個數組是一個字符串,如果沒有這個結尾,那只是一個普通的數組。
比如上面的數組a應該是[‘a’, 'b', 'c', 'd', '\0']的一個長度爲5的數組。
可以直接使用,如cout<<a<<endl可以直接打印字符串
所以一定要注意長度,如果保存超過聲明長度的字符串,數組末尾就沒有'\0'字符,而且會覆蓋內存中數組後面的數據,造成溢出。
10、多維數組初始化
int a[2][3] = {1, 2, 3, 4, 5}會按照順序(先行後列)爲多維數組初始化,不夠的初始化爲0。既a[0][0]=1, a[0][1]=2 ... a[1][2]=0
int a[2][3] = {{1}, {2, 3}}
會按每行進行初始化,不夠的初始化爲0。既a[0][0]=1, a[0][1]=0, a[0][2]=0, a[,1][0]=2, a[1][1]=3, a[1][2]=0
int a[2][1] = {{1}, {2, 3}}