指標是c/c++中很重要的乙個概念,對指標操作熟悉的人,一般對程式對記憶體的訪問和使用都比較敏感,多了解底層是很有益處的。一直都使用下標(subscript)來訪問陣列。一起來嘗試用指標吧 !
以二維陣列的訪問為例,直接給出**:
#include using namespace std;
int main() ;
/* error codes
for(int **p1 = ia ; p1 != ia + 3 ; p1 ++) }
*/ //correct codes, define p1 as a pointer to array of four ints
//once time
for(int (*p1)[4] = ia ; p1 != ia + 3 ; p1 ++) }
return 0;
}
上面寫了兩份訪問方式,第乙份有問題,編譯的時候,報錯如下:
上面說的是,不能把 int[ ] [ ]型別賦給 int **型別。但是由於c++規定 array 是不能直接賦值的,所以我們也不能把 p1 的型別改為 int [ ] [ ]。那咋辦呢 ?
根據c++對 array 的定義,多維陣列本質上是 array of arrays,因此,二維陣列 int [3][4] 相當於就是乙個一維陣列,只是它的每個元素都是乙個長度為4的一維陣列罷了。因此,對於 p1,我們只要把它定義為乙個指向 「長度為4的一維陣列」 的指標即可。具體定義的格式,在第二份訪問方式也就是正確的那個方式,可以看到。如果還是不是很懂陣列的指標的定義方式,就請自行查閱 參考文獻[1]吧。
對於純指標訪問三維以上的多維陣列的方法,以此類推就行了。
另附乾貨,二維陣列的9種訪問方法,先從程式設計形式上統分為三個大類:(其實還有引用,正在補充當中,就有四種了)
1. 用 range for 訪問 2. 用 指標訪問 3. 用下標 訪問 (其實這三種方法本質上都是使用指標訪問的,range for 本質上是使用了iterator,而iterator實質上就是指標。下標呢就是指標加偏移,所以也是通過指標)
然後,每個大類裡面又細分為三個小類:1. 迭代變數精確到型別 2. 迭代變數型別用auto 3. 迭代變數型別用decltype
**如下所示:
#include #include using namespace std;
int main() ;
/*---------access with ranger for ----------*/
/* range for and precise type */
for(int (&row)[4] : ia)
cout << endl;
/* range for and auto */
for(auto &row : ia)
cout << endl;
/* range for and decltype */
for(decltype(ia[0]) row : ia)
cout << endl;
/*---------access with pointer----------*/
/* pointer and precise type */
for(int (*p1)[4] = ia ; p1 != ia + 3 ; p1 ++)
cout << endl;
/* pointer and auto */
for(auto row = ia ; row != ia + 3 ; row ++)
cout << endl;
/* pointer and decltype */
for(decltype(&ia[0]) p1 = ia; p1 != ia + 3 ; p1 ++)
cout << endl;
/*---------access with subscript----------*/
/* subscript and precise type */
for(int i = 0 ; i < 3 ; i ++)
cout << endl;
/* subscript and auto */
for(auto i = 0 ; i < 3 ; i ++)
cout << endl;
/* subscript and decltype */
for(decltype(0) i = 0 ; i < 3 ; i ++)
return 0;
}
references
[1] 《c++ primer fifth edition》 stanley b. lippman, josée lajoie, barbara e. moo
[2] c++11 range for 遍歷多維陣列, 迭代變數新增引用 "&"的問題
指標 多維陣列 陣列指標 指標陣列
之前對陣列的概念一直沒有理解透徹,只覺得陣列名就是個常量指標而已,用法和基本的指標差不多。所以當我嘗試用二級指標去訪問二維陣列時,就經常會出錯。下面就是剛開始寫的乙個錯誤的程式 include int main int parray null parray iarray printf array 0...
多維陣列和多維指標
指向指標的指標 指標變數在記憶體中會占用一定的空間 可以定義指標來儲存指標變數的位址 int pp本質上還是指標,只是兩個 告訴你這是乙個指向指標的指標char p null char p2 p p2 給p賦值沒有問題,但怎麼使用p 呢?這就需要我們前面多次提到的鑰匙 第一步 根據 p 這個變數,取...
多維陣列 和 多維指標
指標變數在記憶體中會占用一定的空間。可以定義指標來儲存指標變數的位址值。舉例 舉例說明,多級指標的使用,重置動態空間大小 include include int reset char p,int size,int new size else return ret int main return 0 ...