C for迴圈 純指標遍歷多維陣列

2021-07-05 16:17:54 字數 2487 閱讀 8337

指標是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 ...