1. 程式人生 > >C++陣列初始化

C++陣列初始化

C++陣列初始化

定義:

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

 new 表示式分配了一個含有 10  int 型元素的陣列,並返回指向該陣列第一個元素的指標,此返回值初始化了指標 pia

在自由儲存區中建立的陣列物件是沒有名字的,只能通過其地址間接地訪問堆中的物件。

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

動態陣列初始化:

1. 元素只能初始化為元素型別的預設值,而不能像陣列變數一樣,用初始化列表為陣列元素提供各不相同的初值。

2. 對於內建資料型別元素的陣列,必須使用()來顯示指定程式執行初始化操作,否則程式不執行初始化操作:

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

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

3. 類型別元素的陣列,則無論是否使用(),都會自動呼叫其預設建構函式來初始化:

string *psa = new string[10];  // 每個元素呼叫預設建構函式初始化

string *psa = new string[10]();  // 每個元素呼叫預設建構函式初始化

動態分配空陣列:

char *cp = new char[0];

之後,可以動態改變cp的維數。

動態釋放:

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;

}

陣列定義和初始化

一維陣列初始化:

標準方式一 int value[100]; // value[i]的值不定,沒有初始化

標準方式二 int value[100] = {1,2}; // value[0]value[1]的值分別為12,而沒有定義的value[i>1]則初始化為0

指標方式 int* value = new int[n]; // 未初始化

delete []value;  // 一定不能忘了刪除陣列空間

二維陣列初始化:

標準方式一 int value[9][9]; // value[i][j]的值不定,沒有初始化

標準方式二 int value[9][9] = {{1,1},{2}} //value[0][0,1]value[1][0]的值初始化,其他初始化為0

指標方式一 int (*value)[n] = new int[m][n];

             delete []value; // n必須為常量,呼叫直觀。未初始化

指標方式二 int** value = new int* [m];

              for(i) value[i] = new int[n];

              for(i) delete []value[i];

              delete []value; // 多次析構,儲存麻煩,未初始化

指標方式三 int * value = new int[3][4]; // 陣列的儲存是按行儲存的

              delete []value; // 一定要進行記憶體釋放,否則會造成記憶體洩露

多維陣列初始化:

指標方式int * value = new int[m][3][4]; // 只有第一維可以是變數,其他幾維必須都是常量,否則會報錯

            delete []value; // 一定要進行記憶體釋放,否則會造成記憶體洩露

陣列初始化的大括號後面要加“;”來表示結束。

陣列訪問:

指標形式:如二維陣列value[i][j]的訪問:

*(value[i] + j) (*(value + i))[j]

陣列作為引數傳遞

一維陣列引數傳遞:

void Func(int *value);

或者是

void Func(int value[]);

二維陣列傳遞:

定義是 int **value;的傳遞

void Func(int **value);

定義是 int (*value)[n] = new int[m][n];的傳遞

void func(int (*value)[n]); // sizeof(p)=4,sizeof(*value)=sizeof(int)*n;

陣列與指標關係

  • 陣列名的內涵在於其指代實體是一種資料結構,這種資料結構就是陣列;
  • 陣列名的外延在於其可以轉換為指向其指代實體的指標,而且是一個指標常量;
  • 指向陣列的指標則是另外一種變數型別,(在win32平臺下,長度為4),僅僅意味著陣列存放地址。
  • 陣列名作為函式形參時,在函式體內,其失去了本身的內涵,僅僅只是一個指標,而且在其失去其內涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。

陣列的儲存格式

多維陣列在記憶體中儲存時是按照最低維連續的格式儲存的,如二維陣列{{1,2}{3,4}}在記憶體中的位置是這樣順序的“1,3,2,4”,這跟matlab是有區別的,matlab是按列進行儲存的。在使用指標進行索引時很有用。

字元陣列

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

字串中每個字元佔用一個位元組,算上最後的空字元,字串需要的位元組數要比包含的位元組數多一個。如:

char movie_star[15] = “Marilyn Monroe”;

這裡字串是14個字元,但是要定義15個字串的陣列。也可以不指定字元陣列的個數。如:

char movie_star[] = “Marilyn Monroe”;

記憶體洩露

我們定義了一個指標,然後給它賦予了一個地址值,然後又不再使用,但是沒有delete,那麼當給指標賦予其他的地址值時,原來的記憶體將無法釋放,這就叫做記憶體洩露。