[C++]二維陣列配置

更新 發佈閱讀 1 分鐘

1. 問題

給定一段c++程式碼

分別用三種方式配置3個大小相同的二維陣列

img1 , img2 以及img3

	int img1[10][20];

int** img2;
img2 = new int* [10];
for (int i = 0; i < 10; ++i) {
img2[i] = new int[20];
}

int** img3;
img3 = new int* [10];
int* data = new int[10 * 20];
for (int i = 0; i < 10; ++i) {
img3[i] = data + i * 20;
}
  • 三種配置的差別?
  • 若個別對其中索引為[5][6]的元素取址,方法分別為何?期間又有何差別?

2.首先,陣列是指標的語法糖

雖然我們學C/C++都是先學陣列後學指標

但事實上指標的概念在 C 語言發展中比陣列更早出現,並且更加原始

陣列的語法實際上是指標操作的簡化

給定一個陣列arr1

int arr1[5] = { 0 , 1 , 2 , 3 , 4 }; 

編譯器會將arr1視為指向該陣列第一個元素的指標

所以在語法上 arr1[i] 等價於* (arr1 + i)


3.配置的差別

img1直接透過int img1[10][20];宣告

記憶體位址是連續的

img2首先被分配了長度為10,用來存放指標的陣列

而每個陣列中的指標又都被配置了長度為20的int陣列

因此記憶體位置是不連續的

img3同樣被分配了長度為10,用來存放指標的陣列

後面則是透過分配一個連續的一維陣列data

以指針來模擬二維陣列

img3存放的指標,指向data的特定位置

因此記憶體位置是連續的


4.取址的差別

方法一樣,都是用& 符號來取址:&img1[5][6] , &img2[5][6] , &img3[5][6]

但底層邏輯有所差異

其中img1以及img3的尋址都是在連續的記憶體配置上,透過計算指針的偏移量得到

img2需要兩次的間接尋址:取得第5個指針後找的它的第3個元素


5.應用上的優劣

理解原理後,開發中可以根據要求了使用分配方式

img1 的方式屬於靜態分配

編譯時配置,記憶體管理全由編譯器負責,無須手動釋放

十分的簡單易用,位址也連續,大小也是確定的

但缺點也很明顯:靈活性低


img2則是動態分配

最明顯的缺點是性能不佳,訪問元素時需經兩次尋址

但它允許img2 指向的每個陣列長短不一

使用的情況大概只剩不規則且動態的陣列

例如在處理矩形以外的不規則網格時(如稀疏矩陣)

另外記憶體釋放時要逐行釋放


img3 為動態分配

兼具動態分配優點,且記憶體位址連續

算是在性能與靈活性之間的平衡點

記憶體釋放時需要先對實際數據data釋放

再對存放指針的陣列img3釋放

留言
avatar-img
typedef struct 隨筆記{
1會員
6內容數
如果是失業的時候寫的 -那就是隨筆 如果是工作的時候寫的 -那就是筆記 但我狀態切換的很頻繁 那目前這坨東西就定義成「隨筆記」好了
2024/09/22
探討指向函數的指標 這種用法在稍具規模的專案中常看到 但自己實作時很少用到 但偏偏有時面試會問Orz
Thumbnail
2024/09/22
探討指向函數的指標 這種用法在稍具規模的專案中常看到 但自己實作時很少用到 但偏偏有時面試會問Orz
Thumbnail
2024/09/10
找工作面試常常問這個 就簡單紀錄一下
Thumbnail
2024/09/10
找工作面試常常問這個 就簡單紀錄一下
Thumbnail
2024/07/22
就簡單介紹一下static
Thumbnail
2024/07/22
就簡單介紹一下static
Thumbnail
看更多
你可能也想看
Thumbnail
C#程式由一或多個檔案組成,包含命名空間、類別、結構、介面、列舉和委派等型別。Main方法是C#應用程式的進入點。在C#中,註解用於在程式碼中添加說明,有單行和多行兩種類型。變數的定義需要指定變數的類型和名稱,可以一次為多個變數賦值。
Thumbnail
C#程式由一或多個檔案組成,包含命名空間、類別、結構、介面、列舉和委派等型別。Main方法是C#應用程式的進入點。在C#中,註解用於在程式碼中添加說明,有單行和多行兩種類型。變數的定義需要指定變數的類型和名稱,可以一次為多個變數賦值。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
註解 & Print & 變數型態
Thumbnail
註解 & Print & 變數型態
Thumbnail
Creative Coding 作品變化概念,有或沒有的差別,隨機性,色彩模式的調整...等
Thumbnail
Creative Coding 作品變化概念,有或沒有的差別,隨機性,色彩模式的調整...等
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
在本章中,我們探討了CSS Grid佈局的基本概念和應用。CSS Grid提供了一個強大而靈活的二維佈局系統,使得處理複雜的網頁佈局變得更加簡單和直觀。我們學習了如何設置Grid容器和Grid項目,以及如何使用各種Grid屬性來定義和管理佈局。
Thumbnail
在本章中,我們探討了CSS Grid佈局的基本概念和應用。CSS Grid提供了一個強大而靈活的二維佈局系統,使得處理複雜的網頁佈局變得更加簡單和直觀。我們學習了如何設置Grid容器和Grid項目,以及如何使用各種Grid屬性來定義和管理佈局。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News