陣列宣告和定義的注意事項
一、不允許陣列拷貝和賦值
int a[] = {1,2,3}; //含有3個整數的陣列
int a2[]= a;//錯誤:不允許使用一個數組初始化另一個數組
a2 = a; //錯誤:不能把一個數組直接賦值給另一個數組
二、複雜的陣列宣告
int arr[10];
int *ptrs[10]; //ptrs是含有10個整形指標的陣列
int &refs[10]=/*?*/; //錯誤:不存在引用的陣列
int (*parray)[10] = &arr; //parray指向一個含有10個整數的陣列
int (&arrRef)[10] = arr; //arrRef引用一個含有10個整數的陣列
int *(&arry)[10] = ptrs;//arry是陣列的引用,該陣列含有10個指標
三、指標和陣列
int ia[10];
auto ia2(ia);//ia2是一個整型指標int *,指向ia的第一個元素。
ia2= 42;//錯誤:ia2是一個指標,不能用int值給指標賦值。
auto ia3(&ia[0]); //顯然ia2的型別是int*。
decltype(ia) ia4 = {1,2,3,4,5,6,7,8,9,0};//正確:當使用decltype關鍵字時不會發生轉換,decltype(ia)返回的型別是由10個整數構成的陣列。
int p = 0;
ia4 = p; //錯誤:不能用整型指標給陣列賦值。
ia4[4] = 10;//正確:把i的值賦給ia4的一個元素。
四、指向陣列尾部的下一個地主
1. int arr[10] = {1,2,3,4,5,6,7,8,9,0
int *e = &arr[10];//指向arr尾元素的下一位置的指標
利用e來寫陣列迴圈
for(int *b = arr; b != e; ++b)
cout << *b << endl; //輸出arr的元素
2.使用標準庫函式begin和end。
int arr[10];
int *beg = begin(arr);
int *last = end(arr);
for (beg;beg != last;++beg)
{
cout << *beg << endl;
}
五、下標和指標
int ia[] = {1,2,3,4,5};
int *p = ia;
int k = p[-2];//p[-2]是ia[0]表示的那個元素
六、使用陣列初始化vector物件
不允許使用一個數組為另一個內建型別的陣列賦初值,也不允許使用vector物件初始化陣列。相反的,允許使用陣列來初始化vector物件。要實現這一目的,只需指明要拷貝區域的首元素地址和尾後地址就可以了:
int int_arr[] = {1,2,3,4,6,7};
vector<int> ivec(begin(int_arr),end(int_arr)); //ivec有6個元素,分別是int_arr中對應元素的副本。
用於初始化vector物件的值也可能僅是陣列的一部分
vector<int>subVec(int_arr + 1, int_arr + 4); //拷貝三個元素:int_arr[1]、int_arr[2]、int_arr[3];
[注意]:儘量使用標準庫型別而非陣列。
七、使用範圍for語句處理多維陣列
int ia[rowCnt][colCnt]; //12個未初始化的元素
//對於每一行
for(size_t i = 0; i != rowCnt; ++ i)
{
//對於行內每一列
for(size_t j = 0; j != colCnt; ++j)
{
//將元素的位置索引作為它的值
ia[i][j] = i * colCnt +j;
}
}
由於c++新標準中新增了範圍for語句,所以前一個程式可以簡化如下形式:
size_t cnt = 0;
for(auto &row : ia)//必須用引用的形式,如果不用就相當於row的型別是int *,這樣內層的迴圈就不合法了,編譯器會報錯。
{
for(auto &col : row)
{
col = cnt;
++cnt;
}
}