陣列是能用索引訪問的同質元素連續集合,這裡的連續是指數組元素在記憶體中是相鄰的,中間不存在空隙,跟鍊錶的不一樣,而同質是指元素都是同一種型別。
1.指標表示法和陣列表示法
指標在處理陣列時很有用,可以用指標指向已有的陣列,也可以從堆上分配記憶體然後把這塊記憶體當做乙個陣列使用。陣列表示法和指標表示法某種意義上可以互換,程式使用上可以相互轉換,方便理解程式,一般陣列下標形式方便看懂程式。
int vector[5] = ;
int * pv = vector; //vector=&vector[0], 陣列名代表陣列首元素的位址
這裡pv[i] = *(pv + i) = *(vector + i) //兩種表示方法相等的,可以互相轉換
陣列表示法可以理解為「偏移並解引」操作,vector[2]表示式表示從vector開始,向右偏移兩個位置,然後解引哪個位置獲取其值。pv是乙個左值,左值表示賦值操作符左邊的符號,左值必須能被修改修改,像vector陣列名字不能作為左值,陣列名為固定常量位址。
2.用malloc建立一維陣列
如果從堆上分配記憶體並把位址賦給乙個指標,可以對指標使用陣列下標並把這塊記憶體當成乙個陣列。
int *pv = (int*)malloc(5 * sizeof(int));
for(int i=0; i<5; i++)
pv[i] = i=1;
也可以使用下面這樣的指標表示法
for(int i=0; i<5; i++)
*(pv + i)= i=1;
3.一維陣列作為函式引數
一維陣列作為引數傳遞給函式實際是通過值來傳遞陣列的位址的,這樣資訊傳遞更搞笑,不需要傳遞整個陣列,從文不需要在棧上分配記憶體,因此也意味著要傳遞陣列長度,否則在函式看來,只知道陣列的位址而不知道陣列長度
陣列表示法傳遞和使用一維陣列:
指標表示法傳遞和使用一維陣列:
4.指標和多維陣列
二維陣列的每一行都可以當做一維陣列,會影響用指標處理多維陣列的行為
int matrix[2][5] = ,}
int (*pmatrix)[5] = matrix; //等於matrix[0]的位址,pmatrix = &matrix[0] = &(matrix + 0)
pmatrix++; //指向matrix[1], &matrix[1] = &(matrix + 1)
printf("%d\n", sizeof(matrix[0])); //顯示20個位元組
這裡動單位是行或者乙個長度為5的陣列,5個元素為一行,陣列指標也叫行指標,因此matrix+1返回的位址不是從陣列開頭偏移了,而是偏移了第一行的長度,20個位元組。
二維陣列的每一行都可以當做一維陣列,matrix[0], matrix[1]可以理解成一維陣列名,都是乙個位址,一維陣列的陣列表示法和指標表示法對二維陣列完全適用。
5.二維陣列作函式形參
給函式傳遞多維陣列很容易讓人迷惑,尤其是指標表示法情況下,傳遞時候要考慮陣列的維度及每一維的大小
要想在函式內部使用陣列表示法,必須制定陣列的形態,否則編譯器無法使用下標。
傳遞陣列matrix,可以這麼寫:
void display2darray(int arr[5], int rows)
或者怎麼寫:
void display2darray(int (*arr)[5], int rows)
6.為二維陣列連續分配記憶體
二維陣列連續分配記憶體有兩種方法,第一種首先分配外層陣列,然後是各行所需的所有記憶體。第二種一次性分配所有記憶體。
方法一:
方法二:
陣列所需的所有記憶體一次性分配
後面的**用到這個陣列時不能使用下標,必須手動計算索引,如下所示:
指標陣列和陣列指標
有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...
指標陣列和陣列指標
理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...
指標陣列和陣列指標
該文時自己對指標陣列用法的一點總結,還望高手指點不足原文如下 由於以前對指標陣列不太明白,所以自己寫了 乙個小的測試程式來驗證了自己的猜測,先總結如下 指標陣列,由名字就可以知道的該陣列中的成員都是為指標的。其定義的方法為 char p 5 該初定義乙個包含5個char 型別的陣列的指標,由於p本身...