福彩群英会购买技巧:C++ Primer ch3 指針和數組

体彩赛车购买技巧 www.xyaad.icu 2/22/2017來源:ASP.NET技巧人氣:8345

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(); //將內置數組的內容復制到vector int 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 * 內遍歷,這顯然和程序的初衷相去甚遠。