日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++数组(一维、二维、三维)的动态分配new、初始化memset和释放delete

發布時間:2024/4/15 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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目前還沒有這般的人性化,具體應該這樣做:
[cpp]?view plaincopy
  • 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只作用于一塊連續的內存空間,而動態開辟的空間不一定是連續的,所以具體寫法如下:
    [cpp]?view plaincopy
  • 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的第三個參數有了變化。
    撤銷: [cpp]?view plaincopy
  • for?(int?i?=?0;?i?<?10;?i?++)??
  • {??
  • ?????delete[]?array[i];??
  • }??
  • delete?[]?array;??
  • 三維數組

    類似于二維數組,用一個例子說明: [cpp]?view plaincopy
  • #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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。