詳解C++?指針與二維數(shù)組名
和一維數(shù)組類似,C++ 將二維數(shù)組名解釋為其第一個元素的地址,而二維數(shù)組的第一個元素為一維數(shù)組,下面詳細(xì)總結(jié)下二維數(shù)組名的性質(zhì)。
和一維數(shù)組類似,C++ 將二維數(shù)組名解釋為其第一個元素的地址,而二維數(shù)組的第一個元素為一維數(shù)組,以下面的程序為例,二維數(shù)組名 array2d 和 &array2d[0] 等效,它們的類型都為 short (*)[5];對數(shù)組名應(yīng)用地址運算符時,得到的是整個數(shù)組的地址,它的類型為 short (*)[5][5],假設(shè) short 寬 2 字節(jié),系統(tǒng)為 32 位,數(shù)組首地址為0x00BCF8FC,例子中幾種表示的區(qū)別為:
- 數(shù)組名
array2d和&array2d[0]等效,類型都為short (*)[5],存儲的是一個 10 字節(jié)內(nèi)存塊的地址,它們指向的對象是包含 5 個元素的short數(shù)組,但在運用sizeof()時,這兩者會有區(qū)別,sizeof(array2d)=50而sizeof(&array2d[0])=4。 - 表示
&array2d的類型為short (*)[5][5],存儲的是一個 50 字節(jié)內(nèi)存塊的地址,它指向的對象是 5 行 5 列的二維short數(shù)組。 - 表示
&array2d[0][0]和array2d[0]等效,類型都為short *,存儲的是一個 2 字節(jié)內(nèi)存塊的地址,它指向的對象是short類型數(shù)據(jù),但在運用sizeof()時,這兩者會有區(qū)別,sizeof(&array2d[0][0])=4而sizeof(array2d[0])=10。 - 類型
short **,存儲的是一個 4 字節(jié)內(nèi)存塊的地址,它指向的對象是short*類型數(shù)據(jù)。
//聲明并初始化數(shù)組
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}};
//聲明并初始化指針一:以下幾種賦值結(jié)果對ptra等效
short (*ptra)[5] = array2d; //方式一:值為0x00BCF8FC
short (*ptra)[5] = &array2d[0]; //方式二:值為0x00BCF8FC
//聲明并初始化指針二
short (*ptrb)[5][5] = &array2d; //值為0x00BCF8FC
//聲明并初始化指針三:以下幾種賦值結(jié)果對ptrc等效
short *ptrc = &array2d[0][0]; //方式一:值為0x00BCF8FC
short *ptrc = array2d[0]; //方式二:值為0x00BCF8FC
//聲明并初始化指針?biāo)模阂韵聨追N賦值結(jié)果對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[]釋放內(nèi)存
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[]釋放內(nèi)存
//訪問數(shù)組第3行第4列的元素
cout << array2d[2][3]; //結(jié)果為9
cout << *(array2d[2]+3); //結(jié)果為9
cout << *(*(array2d+2)+3);//結(jié)果為9
cout << ptra[2][3]; //結(jié)果為9
cout << *(ptra[2]+3); //結(jié)果為9
cout << *(*(ptra+2)+3); //結(jié)果為9
cout << (*ptrb)[2][3]; //結(jié)果為9
cout << *((*ptrb)[2]+3);//結(jié)果為9
cout << *(*(*ptrb+2)+3);//結(jié)果為9
cout << ptrc[2*5+3]; //結(jié)果為9
cout << *(ptrc+2*5+3); //結(jié)果為9
cout << ptrd[2][3]; //結(jié)果為9
cout << *(ptrd[2]+3); //結(jié)果為9
cout << *(*(ptrd+2)+3); //結(jié)果為9
//應(yīng)用指針?biāo)阈g(shù)時單位1表示的字節(jié)數(shù)
cout << int(array2d+1)-int(array2d); //結(jié)果為10
cout << int(&array2d[0]+1)-int(&array2d[0]); //結(jié)果為10
cout << int(&array2d+1)-int(&array2d); //結(jié)果為50
cout << int(&array2d[0][0]+1)-int(&array2d[0][0]);//結(jié)果為2
cout << int(array2d[0]+1)-int(array2d[0]); //結(jié)果為2
cout << int(ptra+1)-int(ptra); //結(jié)果為10
cout << int(ptrb+1)-int(ptrb); //結(jié)果為50
cout << int(ptrc+1)-int(ptrc); //結(jié)果為2
cout << int(ptrd+1)-int(ptrd); //結(jié)果為4
//應(yīng)用sizeof()獲得內(nèi)存量大小
cout << sizeof(array2d); //結(jié)果為50
cout << sizeof(&array2d[0]); //結(jié)果為4
cout << sizeof(&array2d); //結(jié)果為4
cout << sizeof(&array2d[0][0]);//結(jié)果為4
cout << sizeof(array2d[0]); //結(jié)果為10
cout << sizeof(array2d[0][0]); //結(jié)果為2
cout << sizeof(ptra); //結(jié)果為4
cout << sizeof(ptrb); //結(jié)果為4
cout << sizeof(ptrc); //結(jié)果為4
cout << sizeof(ptrd); //結(jié)果為4版權(quán)聲明:本文系博主原創(chuàng)文章,著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請附上出處鏈接。遵循 署名-非商業(yè)性使用-相同方式共享 4.0 國際版 (CC BY-NC-SA 4.0) 版權(quán)協(xié)議。
補充介紹:C++二維數(shù)組名與數(shù)組指針的思考
二維數(shù)組名和數(shù)組指針可以當(dāng)做一個東西用,但兩者之間的含義是不同的。
二維數(shù)組名是一個指向數(shù)組中所有元素的指針,而數(shù)組指針是一個行指針。體現(xiàn)在sizeof()上的不同。
#include <iostream>
using namespace std;
int main()
{
// a是一個二維數(shù)組名,指向一個二維數(shù)組
int a[2][3] = {{1,2,3},{4,5,6}};
// a所占的內(nèi)存為24,即6*4
cout<<sizeof(a)<<endl;
// 輸出為4
// a:&a[0] a+1:&a[1] *(a+1) : a[1] = &a[1][0]
// **(a+1) = a[1][0]
cout<<**(a+1)<<endl;
// 輸出為3
// a:&a[0] *a:a[0]:&a[0][0] *a+2:&a[0][2]
// *(*a+2):a[0][2]
cout<<*(*a+2)<<endl;
// 數(shù)組指針
int (*b)[3] = a;
// 數(shù)組指針可以當(dāng)做二維數(shù)組名用
cout<<**(b+1)<<endl;
cout<<*(*b+2)<<endl;
cout<<sizeof(b)<<endl;
}到此這篇關(guān)于C++ 指針與二維數(shù)組名的文章就介紹到這了,更多相關(guān)C++ 指針與二維數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談int8_t int64_t size_t ssize_t的相關(guān)問題(詳解)
下面小編就為大家?guī)硪黄獪\談int8_t int64_t size_t ssize_t的相關(guān)問題(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
C++中的std::format?如何實現(xiàn)編譯期格式檢查

