網站首頁 編程語言 正文
和一維數組類似,C++ 將二維數組名解釋為其第一個元素的地址,而二維數組的第一個元素為一維數組,下面詳細總結下二維數組名的性質。
和一維數組類似,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
版權聲明:本文系博主原創文章,著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請附上出處鏈接。遵循 署名-非商業性使用-相同方式共享 4.0 國際版 (CC BY-NC-SA 4.0) 版權協議。
補充介紹:C++二維數組名與數組指針的思考
二維數組名和數組指針可以當做一個東西用,但兩者之間的含義是不同的。
二維數組名是一個指向數組中所有元素的指針,而數組指針是一個行指針。體現在sizeof()上的不同。
#include <iostream> using namespace std; int main() { // a是一個二維數組名,指向一個二維數組 int a[2][3] = {{1,2,3},{4,5,6}}; // a所占的內存為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; // 數組指針 int (*b)[3] = a; // 數組指針可以當做二維數組名用 cout<<**(b+1)<<endl; cout<<*(*b+2)<<endl; cout<<sizeof(b)<<endl; }
原文鏈接:https://www.cnblogs.com/young520/p/16687946.html
相關推薦
- 2022-05-05 Entity?Framework使用Fluent?API配置案例_實用技巧
- 2022-10-19 為什么不要在?Flutter?中使用全局變量_Android
- 2022-07-01 淺談C語言中的sizeof()和strlen()的區別_C 語言
- 2022-12-11 Django切換數據庫和遷移數據詳解_python
- 2022-05-25 C語言中操作字符串的函數詳解_C 語言
- 2022-11-14 react裝飾器與高階組件及簡單樣式修改的操作詳解_React
- 2022-12-29 Kotlin標準函數與靜態方法應用詳解_Android
- 2022-06-08 FreeRTOS任務控制API函數的功能分析_操作系統
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支