和一維陣列類似,C++ 將二維陣列名解釋為其第一個元素的地址,而二維陣列的第一個元素為一維陣列,以下面的程式為例,二維陣列名 array2d 和 &array2d[0] 等效,它們的型別都為 short (*)[5];對陣列名應用地址運算子時,得到的是整個陣列的地址,它的型別為 short (*)[5][5],假設 short 寬 2 位元組,系統為 32 位,陣列首地址為0x00BCF8FC,例子中幾種表示的區別為:
- 陣列名
array2d和&array2d[0]等效,型別都為short (*)[5],存盤的是一個 10 位元組記憶體塊的地址,它們指向的物件是包含 5 個元素的short陣列,但在運用sizeof()時,這兩者會有區別,sizeof(array2d)=50而sizeof(&array2d[0])=4, - 表示
&array2d的型別為short (*)[5][5],存盤的是一個 50 位元組記憶體塊的地址,它指向的物件是 5 行 5 列的二維short陣列, - 表示
&array2d[0][0]和array2d[0]等效,型別都為short *,存盤的是一個 2 位元組記憶體塊的地址,它指向的物件是short型別資料,但在運用sizeof()時,這兩者會有區別,sizeof(&array2d[0][0])=4而sizeof(array2d[0])=10, - 型別
short **,存盤的是一個 4 位元組記憶體塊的地址,它指向的物件是short*型別資料,
//宣告并初始化陣列
short array2d[5][5] = {{5,2,8,4,1},
{2,2,4,6,8},
{1,5,8,9,4},
{5,7,6,2,5},
{7,6,5,8,1}};
//宣告并初始化指標一:以下幾種賦值結果對ptra等效
short (*ptra)[5] = array2d; //方式一:值為0x00BCF8FC
short (*ptra)[5] = &array2d[0]; //方式二:值為0x00BCF8FC
//宣告并初始化指標二
short (*ptrb)[5][5] = &array2d; //值為0x00BCF8FC
//宣告并初始化指標三:以下幾種賦值結果對ptrc等效
short *ptrc = &array2d[0][0]; //方式一:值為0x00BCF8FC
short *ptrc = array2d[0]; //方式二:值為0x00BCF8FC
//宣告并初始化指標四:以下幾種賦值結果對ptrd等效
short *ptrTmp[5] = {array2d[0],array2d[1],array2d[2],array2d[3],array2d[4]};
short** ptrd = ptrTmp; //方式一:值為0x00BCF8A4
short** ptrd = new short*[5]{
array2d[0],
array2d[1],
array2d[2],
array2d[3],
array2d[4]}; //方式二:值為0x01156470,需配合使用delete[]釋放記憶體
short** ptrd = new short*[5]();
ptrd[0] = array2d[0];
ptrd[1] = array2d[1];
ptrd[2] = array2d[2];
ptrd[3] = array2d[3];
ptrd[4] = array2d[4]; //方式三:值為0x01046AE0,需配合使用delete[]釋放記憶體
//訪問陣列第3行第4列的元素
cout << array2d[2][3]; //結果為9
cout << *(array2d[2]+3); //結果為9
cout << *(*(array2d+2)+3);//結果為9
cout << ptra[2][3]; //結果為9
cout << *(ptra[2]+3); //結果為9
cout << *(*(ptra+2)+3); //結果為9
cout << (*ptrb)[2][3]; //結果為9
cout << *((*ptrb)[2]+3);//結果為9
cout << *(*(*ptrb+2)+3);//結果為9
cout << ptrc[2*5+3]; //結果為9
cout << *(ptrc+2*5+3); //結果為9
cout << ptrd[2][3]; //結果為9
cout << *(ptrd[2]+3); //結果為9
cout << *(*(ptrd+2)+3); //結果為9
//應用指標算術時單位1表示的位元組數
cout << int(array2d+1)-int(array2d); //結果為10
cout << int(&array2d[0]+1)-int(&array2d[0]); //結果為10
cout << int(&array2d+1)-int(&array2d); //結果為50
cout << int(&array2d[0][0]+1)-int(&array2d[0][0]);//結果為2
cout << int(array2d[0]+1)-int(array2d[0]); //結果為2
cout << int(ptra+1)-int(ptra); //結果為10
cout << int(ptrb+1)-int(ptrb); //結果為50
cout << int(ptrc+1)-int(ptrc); //結果為2
cout << int(ptrd+1)-int(ptrd); //結果為4
//應用sizeof()獲得記憶體量大小
cout << sizeof(array2d); //結果為50
cout << sizeof(&array2d[0]); //結果為4
cout << sizeof(&array2d); //結果為4
cout << sizeof(&array2d[0][0]);//結果為4
cout << sizeof(array2d[0]); //結果為10
cout << sizeof(array2d[0][0]); //結果為2
cout << sizeof(ptra); //結果為4
cout << sizeof(ptrb); //結果為4
cout << sizeof(ptrc); //結果為4
cout << sizeof(ptrd); //結果為4
本文作者:木三百川
本文鏈接:https://www.cnblogs.com/young520/p/16687946.html
著作權宣告:本文系博主原創文章,著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請附上出處鏈接,遵循 署名-非商業性使用-相同方式共享 4.0 國際版 (CC BY-NC-SA 4.0) 著作權協議,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/507109.html
標籤:C++
上一篇:C++ 指標與一維陣列名
