1. 程式人生 > >C++陣列(一維、二維、三維)的動態分配new、初始化memset和釋放delete

C++陣列(一維、二維、三維)的動態分配new、初始化memset和釋放delete

【原文】http://blog.csdn.net/shanzhizi/article/details/7835752

陣列的動態分配、初始化和釋放經常用到,這裡總結一下,尤其是二維陣列

一維陣列

一維陣列的動態分配,初始化和撤銷都好說,幾乎每一本C++教材都會做出詳細的說明。具體如下:
動態分配: int *array=new int [n];
初始化:memset(array,0,n*sizeof(array));       (也可以利用一個for迴圈對其賦值初始化)
撤銷:delete [] array;

二維陣列

下面來說二維陣列的。 動態分配:
二維陣列(n行m列)利用new來進行動態分配實際上相當於對n個m元陣列進行動態分配,只不過我們不能一味的按照動態分配一維陣列的方法來進行這項操作。MSVC目前還沒有這般的人性化,具體應該這樣做:
int **array;
array=new int *[10];
for(int i=0;i<10;i++)
   array[i]=new int [5];
上面的操作完成了一個10行5列的二維陣列array[10][5]的動態分配,可以看到我們先動態分配了一個10單元的陣列的指標的指標的首地址給**array,然後再對其每個首地址進行遍歷,同時完成一個5單元的陣列的動態分分配,並把首地址給*array[i],從而最終完成了二維陣列array[10][5]的動態分配。我們可以依此類推得到三維以至多維的陣列的動態分配方法。 初始化:
如果把一維陣列初始化辦法照搬過來就會發現對於動態分配的二維陣列並不適用。這就要理解到memset這個函式三個引數的含義。MSDNhttp://blog.csdn.net/shanzhizi對memset的描述如下:
Sets buffers to a specified character.
void *memset( void *dest, int c, size_t count );

可見memset只能作用於一個一維陣列void *dest,因此最好的辦法就是和二維陣列的動態分配結合起來,new一個,memset一個。我的理解是memset只作用於一塊連續的記憶體空間,而動態開闢的空間不一定是連續的,所以具體寫法如下:
int **array;
array=new int *[10];
for(int i=0;i<10;i++)
{
    array[i]=new int [5];
    memset(array[i],0,5*sizeof(int)); //注意這裡是array[i]
}
可以看到這裡的memset的第三個引數有了變化。
撤銷:
for (int i = 0; i < 10; i ++)
{
     delete[] array[i];
}
delete [] array;

三維陣列

類似於二維陣列,用一個例子說明:
#include <stdio.h>
#include <memory.h>
#define size1 5
#define size2 10
#define size3 15
int main()
{
       int *** arr;
       int i,j,k;
       /////////////////// 動態開闢 相當於arr[size1][size2][size3]
       arr = new int**[size1];
       for (i = 0; i < size1; i ++) {
              arr[i] = new int*[size2];
              for (j = 0; j < size2; j ++) {
                     arr[i][j] = new int[size3];
              }
       }
       /////////////////// 用for迴圈初始化
       for (i = 0; i < size1; i ++) {
              for (j = 0; j < size2; j ++) {
                     for (k = 0; k < size3; k ++) {
                            arr[i][j][k] = i * j * k;
                     }
              }
       }
       for (i = 0; i < size1; i ++) {
              for (j = 0; j < size2; j ++) {
                     for (k = 0; k < size3; k ++) {
                            printf("i*j*k=%d*%d*%d=%d/n",i,j,k,arr[i][j][k]);
                     }
              }
       }
       /////////////////// 用memset,如果是靜態int arr[][][]的話,直接memset(arr,0,sizeof(arr));陣列初始化為0
       for (i = 0; i < size1; i ++) {
              for (j = 0; j < size2; j ++) {
                     memset(arr[i][j],-1,sizeof(int) * size3);
              }
       }
       for (i = 0; i < size1; i ++) {
              for (j = 0; j < size2; j ++) {
                     for (k = 0; k < size3; k ++) {
                            printf("i,j,k=%d,%d,%d=%d/n",i,j,k,arr[i][j][k]);
                     }
              }
       }
       ///////////////////// 釋放記憶體
       for (i = 0; i < size1; i ++) {
              for (j = 0; j < size2; j ++) {
                     delete[] arr[i][j];
              }
              delete[] arr[i];
       }
       delete[] arr;
       return 0;
}

相關推薦

C++陣列動態分配new初始memset釋放delete

【原文】http://blog.csdn.net/shanzhizi/article/details/7835752 陣列的動態分配、初始化和釋放經常用到,這裡總結一下,尤其是二維陣列 一維陣列 一維陣列的動態分配,初始化和撤銷都好說,幾乎每一本C++教材都會做出詳細的說明

有限狀態機FSM寫法的個人總結段式,段式,段式

      狀態機描述時關鍵是要描述清楚幾個狀態機的要素,即如何進行狀態轉移,每個狀態的輸出是什麼,狀態轉移的條件等。具體描述時方法各種各樣,最常見的有三種描述方式:      (1)一段式:整個狀態機寫到一個always模組裡面,在該模組中既描述狀態轉移,又描述狀態的輸入

ios切圖倍圖+倍圖+倍圖

工作中,一直做移動端app(不包括ios和ipad),所以對一些手機端的比較熟悉,但沒做過ipad端的,今天工作中正好有碰到一個ipad設計(效果圖+切圖),剛開始以為和手機端一樣,但做的過程中發現還是有不一樣的地方,比如常識性的切圖(一倍圖,@2x,@3x),我開始以為只要

移除連結串列元素leetcode簡單篇百零

刪除連結串列中等於給定值 val 的所有節點。 示例: 輸入: 1->2->6->3->4->5->6, val = 6 輸出: 1->2->3->4->5 struct ListNode* remove

陣列與指標的關係與區別總結

陣列用於同種資料型別的儲存,常規的陣列選取的是一塊連續記憶體空間來儲存同種型別的資料。1、  靜態陣列靜態陣列是在宣告時已經確定子陣列大小的陣列,即陣列元素的個數固定不變。在編譯期間在棧中分配好記憶體的陣列,在執行期間不能改變儲存空間,執行後由系統自動釋放。陣列的宣告int

C語言 陣列指標動態分配釋放

C 二維陣列(指標)動態分配和釋放 先明確下概念: 所謂32位處理器就是一次只能處理32位,也就是4個位元組的資料,而64位處理器一次就能處理64位,即8個位元組的資料。如果我們將總長128位的指令分別按照16位、32位、64位為單位進行編輯的話:舊的16位處理器,比如In

動態申請陣列

void main() { int i, j; int m=3, n=2;//3行2列 int **p; p = (int **)malloc(m * sizeof(int(*))); //定義第一列 for(i=0; i<m; i++) p[i] = (

C++認識陣列

陣列:具有相同型別資料的集合。 1.一維陣列的定義 定義形式:   資料型別  陣列名[常量表達式]; int a[6];          PS:6,及方框中的數字為陣列大小,而進行運算時a[6]中6表示陣列下標。 可以通過分步除錯檢視陣列中的元素及個數,陣列名代表第

動態陣列探祕

因為做leetcode的一道演算法題https://leetcode-cn.com/problems/regular-expression-matching/,需要用到二維陣列,結果自己在理解和使用上有很大誤解,所以單獨拿出來,從記憶體等各方面透徹的梳理一遍。 一維陣列 char * a =

C語言 數組指針動態分配釋放

i++ 進制 numbers 很多 print 算術 uil 換算 som C 二維數組(指針)動態分配和釋放 先明確下概念: 所謂32位處理器就是一次只能處理32位,也就是4個字節的數據,而64位處理器一次就能處理64位,即8個字節的數據。如果我們將總長128位的指令分別

Color the ball +數狀陣列

Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28569    Accepted

有限元變頻寬儲存的剛度方程的LDLT求解用C++實現

在有限元程式中,剛度方程[K]建立完畢,節點力向量F經過了非齊次邊界條件處理、等效節點力處理後,都搞成了已知量。此時,就可以解F=KD方程組,來求節點位移向量D了。 求解F=KD方程組的方法有很多,主要可以分為精確解法和迭代解法兩種。顧名思義,精確解法就是直接解出D向量的精

C++ 陣列/多陣列動態分配(new)釋放(delete)

1. 一維陣列 對於簡單的一維陣列動態記憶體分配和釋放,如下:int *array1D;//假定陣列長度為m //動態分配空間 array1D = new int [m]; //釋放 delete [] array1D; 2. 二維陣列 二維陣列的動態分配和釋放//假

C語言之你不得不知的陣列

1、強制型別轉換運算子:     (double)a --------------------(將a轉換為double型別)     (int)(x+y)-------------------(將x+y的值轉換為int型別)   &n

C語言 資料型別儲存類分配空間

C語言是一種移植性強,面向過程的語言,最初由丹尼斯創立,用於編寫UNIX作業系統,移植性強指的是它的程式碼通用性強。 特點:操作簡易,結構化語言,適合處理底層事件。 我的第一個C語言程式 #include <stdio.h> /*前處理器指令,在實際編譯之前執行的*

Saltstack自動化運工具鍵部署高可用負載均衡叢集

在上篇部落格中我們利用salt推送了一臺主機上的haproxy為了實現高可用和負載均衡,我們再使用一臺虛擬機器server4搭建叢集 server1和server4組成高可用和負載均衡叢集 在server4 做好底層配置: 在server4上安裝minion,更改配置檔

Python中reshape的用法及多個數組合併為陣列的方法

reshape(shape) : 不改變陣列元素,返回一個shape形狀的陣列,原陣列不變。是對每行元素進行處理 resize(shape) : 與.reshape()功能一致,但修改原陣列 In [1]: a = np.arange(20) #原陣列不變 In [2]: a.reshape([

C語言 資料型別儲存類分配空間

C語言是一種移植性強,面向過程的語言,最初由丹尼斯創立,用於編寫UNIX作業系統,移植性強指的是它的程式碼通用性強。 特點:操作簡易,結構化語言,適合處理底層事件。 我的第一個C語言程式 #include <stdio.h> /*前處理器指令,在實

C++ 繼承

c++ 繼承(一)C++繼承的標準寫法:class BaseMonster { public: string name; string skill; uint32_t hp; void attack() { cout << "Base ::

C++ 模板

c++ 模板C++模板類似與C#/Java當中的泛型,即可使用同樣的代碼實現不同的功能。效果類似於繼承(父對象指針指向子指針)。一 : 函數模板#include <iostream> using namespace std; template<typename T>//<type