C++數組初始化方法 [C++]數組初始化

定義:html

int *pia = new int[10]; // array of 10 uninitialized ints

此 new 表達式分配了一個含有 10 個 int 型元素的數組,並返回指向該數組第一個元素的指針,此返回值初始化了指針 piaweb

在自由存儲區中建立的數組對象是沒有名字的,只能經過其地址間接地訪問堆中的對象。數組

注意:C++使用newdelete在堆(自由存儲區)上分配和釋放動態數組。安全

 

 

動態數組初始化:數據結構

1. 元素只能初始化爲元素類型的默認值,而不能像數組變量同樣,用初始化列表爲數組元素提供各不相同的初值。函數

2. 對於內置數據類型元素的數組,必須使用()來顯示指定程序執行初始化操做,不然程序不執行初始化操做:post

int *pia = new int[10]; // 每一個元素都沒有初始化

int *pia2 = new int[10] ();  // 每一個元素初始化爲0

3.類類型元素的數組,則不管是否使用(),都會自動調用其默認構造函數來初始化:學習

string *psa = new string[10];  // 每一個元素調用默認構造函數初始化

string *psa = new string[10]();  // 每一個元素調用默認構造函數初始化

動態分配空數組:url

char *cp = new char[0];

以後,能夠動態改變cp的維數。spa

 

動態釋放:

delete [] pia;

典型使用示例:

const char *pc = "a very long literal string"; // 處理C風格字符串時使用const指針

const size_t len = strlen(pc) +1;      // size_t用於數組的大小和下標

for (size_t ix = 0; ix != 1000000; ++ix) {

    char *pc2 = new char[len]; // pc2指向的存儲空間的內容會動態改變,所以不使用const

    strncpy (pc2, pc, len); // 使用strncpy比使用strcpy安全

    // do something;

    delete [] pc2;

}

參考:C++ Primer 學習筆記:動態數組

 

1、數組定義和初始化

   1: 一維數組初始化:
   2: 標準方式一: int value[100]; // value[i]的值不定,沒有初始化
   3: 標準方式二: int value[100] = {1,2}; // value[0]和value[1]的值分別爲1和2,而沒有定義的value[i>1]
   4:                                  // 則初始化爲0
   5: 指針方式: int* value = new int[n]; // 未初始化
   6:            delete []value;  // 必定不能忘了刪除數組空間
   7:  
   8: 二維數組初始化:
   9: 標準方式一: int value[9][9]; // value[i][j]的值不定,沒有初始化
  10: 標準方式二: int value[9][9] = {{1,1},{2}}; //value[0][0,1]和value[1][0]的值初始化,其餘初始化爲0
  11: 指針方式一: int (*value)[n] = new int[m][n];
  12:              delete []value; // n必須爲常量,調用直觀。未初始化
  13: 指針方式二: int** value = new int* [m];
  14:              for(i) value[i] = new int[n];
  15:              for(i) delete []value[i];
  16:              delete []value; // 屢次析構,存儲麻煩,未初始化
  17: 指針方式三: int * value = new int[3][4]; // 數組的存儲是按行存儲的
  18:              delete []value; // 必定要進行內存釋放,不然會形成內存泄露
  19:  
  20: 多維數組初始化:
  21: 指針方式: int * value = new int[m][3][4]; // 只有第一維能夠是變量,其餘幾維必須都是常量,不然會報錯
  22:            delete []value; // 必定要進行內存釋放,不然會形成內存泄露

數組初始化的大括號後面要加「;」來表示結束。

數組訪問:

指針形式:如二維數組value[i][j]的訪問:

*(value[i] + j) 或

(*(value + i))[j]

2、數組做爲參數傳遞

   1: 一維數組參數傳遞:
   2: void Func(int *value);
   3: 或者是
   4: void Func(int value[]);
   5:  
   6: 二維數組傳遞:
   7: 定義是 int **value;的傳遞
   8: void Func(int **value);
   9: 定義是 int (*value)[n] = new int[m][n];的傳遞
  10: void func(int (*value)[n]); // sizeof(p)=4,sizeof(*value)=sizeof(int)*n;

3、數組與指針關係

一、數組名的內涵在於其指代實體是一種數據結構,這種數據結構就是數組;

二、數組名的外延在於其能夠轉換爲指向其指代實體的指針,並且是一個指針常量;

三、指向數組的指針則是另一種變量類型,(在win32平臺下,長度爲4),僅僅意味着數組存放地址。

四、數組名做爲函數形參時,在函數體內,其失去了自己的內涵,僅僅只是一個指針,並且在其失去其內涵的同時,它還失去了其常量特性,能夠做自增、自減等操做,能夠被修改。

4、數組的存儲格式

多維數組在內存中存儲時是按照最低維連續的格式存儲的,如二維數組{{1,2},{3,4}}在內存中的位置是這樣順序的「1,3,2,4」,這跟matlab是有區別的,matlab是按列進行存儲的。在使用指針進行索引時頗有用。

5、字符數組

char類型的數組被稱做字符數組,一般用來存儲字符串。字符串是附加有特殊字符(串尾標誌)的字符序列。串終止字符代表字符串已經結束,該字符由轉義序列‘\0’定義,有時被稱爲空字符,佔用一個字節,其中8位全爲0。這種形式的字符串一般被稱爲C型字符串,由於以這樣的方式定義字符串是在C語言中推出的,在C++通常使用string,而MFC中則定義了CString類。

字符串中每一個字符佔用一個字節,算上最後的空字符,字符串須要的字節數要比包含的字節數多一個。如:

char movie_star[15] = 「Marilyn Monroe」;

這裏字符串是14個字符,可是要定義15個字符串的數組。也能夠不指定字符數組的個數。如:

char movie_star[] = 「Marilyn Monroe」;

6、內存泄露

咱們定義了一個指針,而後給它賦予了一個地址值,而後又再也不使用,可是沒有delete,那麼當給指針賦予其餘的地址值時,原來的內存將沒法釋放,這就叫作內存泄露。

 

參考:[C++]數組初始化

相關文章
相關標籤/搜索