/*陣列是c內建的基本資料結構
一、陣列概述
獲取元素數量的方式 : 陣列長度除以元素長度
*/ int icount = sizeof(vector) / sizeof(int)
/* 1、一維陣列
2、二維陣列
3、多維陣列
二、指標表示法和陣列
單獨使用陣列名字時候會返回陣列位址,可以把陣列賦值給指標
如 :*/int vector[5] = ;
int *pv = vector;
//只用陣列名字或者對陣列的第乙個元素用取位址操作符是等價的,都會返回vector的位址
printf("%p\n", vector);
printf("%p\n", &vector[0]);
/*陣列下標可以用在指標上,如pv[i]等價於 *(pv + i);
給指標加乙個整數,會把它持有的位址增加這個整數和資料型別長度的乘積,這一點對於給
陣列名字加上整數也適用,下面兩個語句等價
*(pv + i)
*(vector + i)
*///指標和陣列的差別
int vector[5] = ;
/*vector[i],*(vector + i)表達的值一樣,但是前者生成的機器碼是從vector開始,移動i個位置
後者則是從vector開始,在位址上增加i,兩者儘管結果一樣,但是生成的機器碼卻不一樣
分析下以下**
*/int *pv = vector;
pv = pv + 1; // 正確
vector = vector + 1; // 語法錯誤,修改了陣列所持有的位址
pv = vector + 1; // 正確
/*三、用malloc建立一維陣列
如果從堆上分配記憶體並把位址賦值給乙個指標,那就肯定可以對指標使用陣列下標,
並把這塊記憶體當成乙個陣列, 下面**中,複製之前的vector內容
*/int *pv = (int*)malloc(5 * sizeof(int));
for (int i = 0; i < 5; i++)
// 指標表示法
for (int i = 0; i < 5; i++)
```//注意:這種技術分配一塊記憶體,並把它當成陣列,其長度在執行時確定。不過,我們得記得要在用完之後釋放記憶體
/*四、用realloc調整陣列長度
c99標準支援變長陣列,如果,沒有c99,那就用realloc, 如果陣列需要的生命週期比較函式長
那也只能用realloc
練習1 : 實現乙個函式,從標準輸入字元並放入緩衝區,緩衝區會包含除最後的回車字元之外的所有
字元 如果realloc分配成功,不需要再釋放buffer,因為realloc會把原來的緩衝區複製到新的緩衝區中,
再把舊的釋放。如果試圖釋放buffer,十有**程式會終止,因為我們試圖重複釋放同一塊記憶體
練習2 : realloc函式也可以用來減少指標指向的記憶體。實現trim函式,把字串開頭的空白符刪掉
*//*
五、傳遞一維陣列
將一維陣列作為引數傳遞給函式實際就是通過值來傳遞陣列位址
如果不知道陣列長度,就無法處理器元素,最終結果可能是處理的元素太少,也可能
把陣列邊界的記憶體當成陣列的一部分,這樣往往會造成程式非正常終止
1、陣列表示法
*/void displayarray(int arr, int size)
}void testarray()
; displayarray(vector, 5);
}//注意:為了確定陣列元素數量,使用sizeof是不對的
//2、指標表示法
//<1>
void displayarray(int arr, int size)
}// <2>
void displayarray(int *arr, int size)
} //<3>
void displayarray(int *arr, int size)}/*
六、使用指標的一維陣列
指標陣列
*/void pointerarray()
// 等價表示法
*(arr + i) = (int*)malloc(sizeof(int));
**(arr + i) = i;
// 列印
for(int i = 0; i < 5; i++) }
/*七、指標和多維數
可以將多維陣列的一部分看做是子陣列,比如說,二維陣列的每一行都可以看做是
一維陣列
int maxtrix[2][5] = , };
注意兩點:
1、maxtrix返回的位址偏移了第一行的長度,20位元組
2、訪問陣列第一行第二個元素,*(maxtrix[0] + 1)
*//*
八、傳遞多維陣列
二維陣列當做引數傳遞
1、當做指標的陣列
//正確做法
void display2darray(int arr[5], int rows);
void display2darray(int(*arr)[5], int rows);
//錯誤做法
void display2darray(int *arr[5], int rows);
*/ /*
2、全部當做指標
// 宣告方式
*/void display2darrayunkonwnsize(int *arr, int rows, int cols)
void testuse()
/*
九、動態分配二維陣列
1、分配可能不連續的記憶體
*/void allocatememory()
}// 2、第二種技術,陣列所需要的所有記憶體是一次性分配的
void allocatememorywaytwo() }}
// 注意不能使用陣列下標
/*十、不規則陣列和指標
不規則陣列是每一行的列數不一樣的二維陣列
復合字面量是一種c構造,前面看起來像型別轉換操作,後面跟著換括號的
初始化列表
*/void irregulararray()
, (int) ,
(int) ;
}}
深入理解C指標之四 指標和陣列
原文 深入理解c指標之四 指標和陣列 陣列是c內建的基本資料結構,陣列表示法和指標表示法緊密關聯。一種常見的錯誤認識是陣列和指標完全可以互換,儘管陣列名字有時可以當做指標來用,但陣列的名字不是指標。陣列和指標的區別之一就是,儘管陣列的名字可以返回陣列位址,但是名字不能作為賦值操作的目標。陣列是能用索...
C 陣列 2 指標和陣列
1.陣列標準庫函式begin和end 這兩個函式與容器中的同名函式相類似,得到陣列首指標和尾指標.陣列不是類型別,所以不是成員函式.需要注意的是尾指標不能解引用和遞增操作.int a 5 int beg begin a beg指向a首元素的指標 int last end a last指向a尾元素下一...
5 3指標和陣列
定義乙個大小為10的陣列a 10 int a 10 包含了a 0 a 1 a 9 共計10個元素 定義指標 int pa pa指向陣列a的第0個元素,即pa為a 0 的位址。pa a 0 對陣列元素a i 的引用也可以寫為 a i 這樣的形式,這一點至少初看起來很令人吃驚。在求陣列元素a i 的值時...