1. 使用數組的時候,編譯器一般會把它轉換成指針。
2. auto與decltype在分析數組類型時的區別:
int a[] = { 1,2,3 };auto b = a; // 得到的是指針類型int (*p)[3]decltype(a) c; // 得到的是數組類型int [3]3. C++11標準庫函數begin()和end()
接受數組作為參數 定義在iterator頭文件中 end()返回的是不存在的尾后指針 int a[] = { 1,2,3 };int *pB = begin(a);int *pE = end(a);// 利用begin和end遍歷數組for (auto p = pB; p != pE; ++p) { cout << *p << ' ';}4. 指針相減得到的結果類型是名為ptrdiff_t的標準庫類型。
5. 存在數組 int a[] = {1 , 2 , 3 , 4 , 5}; 當你使用下標對數組元素進行隨機訪問的時候(比如訪問a[2]),其實進行的是這樣的操作:
int *p = a;int val = *(p + 2);以此得出,只要指針指向的是數組中的元素,都可以執行下標運算:
int a[] = { 1,2,3,4,5 };int *p = &a[2];int j = p[1]; // j為a[2+1]int k = p[-2]; // k為a[2-2]6. C++標準庫與舊代碼的接口
// c_str()函數:將string類轉換為C風格的字符串string s = "Hello World!";const char *s_elder = s.c_str();//將內置數組的內容復制到vectorint a[] = { 0,1,2,3,4,5 };vector<int> v(begin(a), end(a));7. 關于多維數組
int a[3][4];int(&row)[4] = a[1];// 將row綁定到a的第二個4元素數組上row是行,col是列
使用C++ 11范圍for語句處理多維數組
int a[3][4];int ct = 1;for (auto &row : a) { for (auto &col : row) { col = ct++; }}注意,無論是否進行讀寫操作,必須將外層循環的控制變量聲明成引用類型,這是避免數組被自動轉換為指針。 假如循環寫成如下格式:
for(auto row : a) for(auto col : row){}摘自C++ PRimer:
程序將無法通過編譯。這是因為,像之前一樣的第一個循環遍歷a的所有元素,注意元素實際上是大小為4的數組。因為row不是引用類型,所以編譯器初始化row時會自動將這些數組形式的元素轉換成指向該數組內首元素的指針。這樣得到的row的類型就是int * ,顯然內層的循環就不合法了,編譯器將試圖在一個int * 內遍歷,這顯然和程序的初衷相去甚遠。
新聞熱點
疑難解答
圖片精選