[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釋放

如果是失業的時候寫的 -那就是隨筆 如果是工作的時候寫的 -那就是筆記 但我狀態切換的很頻繁 那目前這坨東西就定義成「隨筆記」好了
留言0
查看全部
發表第一個留言支持創作者!
找工作面試常常問這個 就簡單紀錄一下
牽涉到的工具:wsl2 + anaconda + jupyter-nootbook
就簡單介紹一下static
找工作面試常常問這個 就簡單紀錄一下
牽涉到的工具:wsl2 + anaconda + jupyter-nootbook
就簡單介紹一下static
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
這篇文章介紹了網站的整體架構以及開發時所使用的工具和套件,包括 Next.js、Tailwind CSS 和 socket.io 等。文章回顧了程式碼的重構與優化,幫助開發者提高工作效率,適合希望深入瞭解前端開發和網站架構的讀者。
Thumbnail
在本章中,我們探討了CSS Grid佈局的基本概念和應用。CSS Grid提供了一個強大而靈活的二維佈局系統,使得處理複雜的網頁佈局變得更加簡單和直觀。我們學習了如何設置Grid容器和Grid項目,以及如何使用各種Grid屬性來定義和管理佈局。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
接續上一篇 Step2:VC#專案建立 Step3:IIS新建站台 Step4:VC#架設到IIS中
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
Thumbnail
介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
這篇文章介紹了網站的整體架構以及開發時所使用的工具和套件,包括 Next.js、Tailwind CSS 和 socket.io 等。文章回顧了程式碼的重構與優化,幫助開發者提高工作效率,適合希望深入瞭解前端開發和網站架構的讀者。
Thumbnail
在本章中,我們探討了CSS Grid佈局的基本概念和應用。CSS Grid提供了一個強大而靈活的二維佈局系統,使得處理複雜的網頁佈局變得更加簡單和直觀。我們學習了如何設置Grid容器和Grid項目,以及如何使用各種Grid屬性來定義和管理佈局。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
接續上一篇 Step2:VC#專案建立 Step3:IIS新建站台 Step4:VC#架設到IIS中
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
Thumbnail
介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護