定義:
int *pia = new int[10]; //array of 10 uninitialized ints
此 new 表示式分配了乙個含有 10 個 int 型元素的陣列,並返回指向該陣列第乙個元素的指標,此返回值初始化了指標 pia。
在自由儲存區中建立的陣列物件是沒有名字的,只能通過其位址間接地訪問堆中的物件。
注意:c++使用new和delete在堆(自由儲存區)上分配和釋放動態陣列。
動態陣列初始化:
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) ; //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] = ,}; //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) deletevalue[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]
二、陣列作為引數傳遞
1: 一維陣列引數傳遞:2: void func(int *value);3: 或者是4: void func(intvalue);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;
三、陣列與指標關係
1、陣列名的內涵在於其指代實體是一種資料結構,這種資料結構就是陣列;
2、陣列名的外延在於其可以轉換為指向其指代實體的指標,而且是乙個指標常量;
3、指向陣列的指標則是另外一種變數型別,(在win32平台下,長度為4),僅僅意味著陣列存放位址。
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,那麼當給指標賦予其他的位址值時,原來的記憶體將無法釋放,這就叫做記憶體洩露。
二維陣列的初始化
1.使用兩個for迴圈定義 for i 1 i n i 2.定義時初始化 int a n m 3.使用函式定義 memset 作用是在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快方法 memset函式對陣列只能用於置零 0 或置負一 1 操作 include voi...
二維陣列初始化規則
二維陣列初始化的形式為 資料型別 陣列名 整常量表示式 整常量表示式 在中給出各陣列元素的初值,各初值之間用逗號分開。把中的初值依次賦給各陣列元素。有如下幾種初始化方式 分行進行初始化 int a 2 3 在內部再用把各行分開,第一對中的初值1,2,3是0行的3個元素的初值。第二對中的初值4,5,6...
二維陣列的初始化
1.不分行的初始化,所有陣列元素放在一對 內 1 全部元素初始化 a 2 3 2 部分元素初始化 a 2 3 未初始化的元素預設為0,即a 1 1 0,a 1 2 0。3 省略一維長度下標時的初始化 行下標 a 3 陣列元素個數除以列數,正好除盡,所得的商就是行數。a 3 陣列元素個數除以列數,除不...