二維陣列、指標詳解
阿新 • • 發佈:2018-11-11
二維陣列、指標詳解:
1.研究二維陣列的表示。
首先,用程式碼執行進行測試,驗證的相關結果,
// C.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> using namespace std; int main() { int a[3][4] = { { 1, 3, 5, 7}, { 9, 11, 13, 15}, {17, 19, 21, 23} }; cout <<" a "<< endl; cout << a << endl << endl; cout << " a[0] *(a+0) *a" << endl; cout << a[0] << " " << *(a+0) << " " << *a << endl << endl; cout << " &a[1] a + 1 " << endl; cout << &a[1] << " " << a + 1 << endl << endl << endl; cout << " a[1] *(a + 1) " << endl; cout << a[1] << " " << *(a + 1) << endl << endl; cout << " a[1] + 2 *(a + 1) + 2 " << endl; cout << a[1] + 2 << " " << *(a + 1) + 2 << endl << endl << endl; cout << " *(a[1] + 2) *(*(a + 1) + 2) " << endl; cout <<" "<< *(a[1] + 2) << " " << *(*(a + 1) + 2) << endl << endl; return 0; }
得到結果:
由此可以得出如下結果【仔細看清池一下的表格】:
雖然打印出來的結果一樣,但是其含義不同,其資料型別可能不一樣。且指標接收的值,不是說傳遞一個地址進去就可以得。還要其型別對應的上。指標之所以為派生型別,是因為其必須依靠基本資料型別才能夠使用(參見本人的這篇部落格資料型別、儲存結構、static、extern)。
含義 | 地址 |
資料型別 | |
---|---|---|---|
a | 二維陣列名,指向一維陣列a[0],即0行的首地址 | 008FFAA4 | int (*)[4] |
a[0], *(a+0), *a | 0行0列的地址 | 008FFAA4 | int * |
&a[1], a+1 | 1行首地址 | 008FFAB4 | int (*)[4] |
a[1], *(a+1) | 1行0列元素,a[1][0]的地址 | 008FFAB4 | int * |
a[1]+2, *(a+1)+2 | 1行2列元素,a[1][2]的地址 | 008FFABC | int * |
*(*a[1]+2), *(*(a+1)+2) | 1行2列元素,a[1][2]的值 | 13 |
2.現在研究關於二維陣列和指標的關係
怎麼賦初值呢? 給一個二維陣列。
正確賦值方式:
方式一:int(*p)[4] = a;
方式二:int(*p)[4] = &a[0];
容易錯誤的方式:
錯誤一:int(*p)[4] = a[0];
錯誤二:int(*p)[4] = &(a[0][0]);
那麼由此可以得出結論,重點來了,敲黑板!!!【可以參考C程式設計 p250】
a[0], a[1], a[2]的型別為 int * 型別(指向整型變數);
而a的型別為 int (*)[4],指向 含有四個元素的 一維陣列。
感覺此表比較重要,重點是容易理解。再回顧一遍。[和上面的是同一個表]