數組,做爲C語言中常見的複雜數據類型,瞭解其本質有助於深刻了解C語言web
元素類型角度:數組是相同類型的變量的有序集合測試指針變量佔有內存空間大小
內存角度:聯繫的一大片內存空間
數組
數組元素的個數能夠顯示或隱式指定
數組的初始化能夠用{ 0 },也能夠使用memset初始化svg
int main() { int i = 0; int a[10] = { 1, 2 }; //其餘初始化爲0 int b[] = { 1, 2 }; int c[20] = { 0 }; for (i = 0; i < 10; i++) { printf("%d ", a[i]); } memset(a, 0, sizeof(a)); getchar(); return 0; }
typedef int(MYINT5)[5]; ··· MYINT5i Array; //int Array[5];
數組指針用於指向一個數組函數
typedef int(ArrayType)[5]; ArrayType* pointer;
用數組類型加*定義一個數組指針測試
void main(void) { int a[5];//聲明一個數組類型 typedef int(MYINT5)[5];//用數組類型 加*,定義一個數組指針變量 MYINT5 *array; array = &a; for (i = 0; i < 5; i++) { (*array)[i] = i; } for (i = 0; i < 5; i++) { printf("\n%d %d", a[i], (*array)[i]); } }
typedef int (*MyPointer)[5];
定義一個數組指針類型,而後用類型定義變量spa
void main(void) { int b[5];//聲明一個數組指針類型 typedef int (*MyPointer)[5];//用數組指針類型,去定義一個變量 MyPointer mypoint; mypoint= &b; for (i = 0; i < 5; i++) { (*mypoint)[i] = i; } for (i = 0; i < 5; i++) { printf("\n%d %d", b[i], (*mypoint)[i]); } }
int (*pointer)[n];
直接定義一個數組指針變量設計
void main(void) { int c[5]; int (*pointer)[5] = &c;//直接聲明一個數組指針變量 for (i = 0; i < 5; i++) { (*pointer)[i] = i; } for (i = 0; i < 5; i++) { printf("\n%d %d", c[i], (*pointer)[i]); } }
int a[5] 一維數組名錶明數組首元素的地址
int a[5] ==> a的類型爲int*
指針
實驗:code
int arr[3][4]; printf("arr:%d, arr + 1:%d", arr, arr + 1);
此時輸出打印的結果相差16,也就是4 * 4
,經過這個契機,得出二維數組名的本質
arr的本質是一個數組指針,每次向後移動一維的長度xml
說明 | 寫法 | 寫法 | 寫法 |
---|---|---|---|
第0行第1列元素地址 | a [0]+1 |
*a+1 |
&a[0][1] |
第1行第2列元素地址 | a [1]+2 |
*(a+1)+2 |
&a[1][2] |
第 i 行第 j 列元素地址 | a [i]+j |
*(a+i)+j |
&a[i][j] |
第1行第2列元素的值 | *(a [1]+2) |
*( *(a+1)+2) |
a[1][2] |
第 i 行第 j 列元素的值 | *(a [i]+j) |
*( *(a+i)+j) |
a[i][j] |
正是由於有了這些特性,二維數組在作函數參數的時候,會退化爲二級指針,這樣設計的目的在於參數傳遞的時候不用傳遞太多數據,數組指針作函數參數,通常只會使用到二維
char buf[3][4]
==> char buf[][4]
==> char (*buf)[4]
多維數組在內存中是線性存儲的,即按照低維到高維線性排序
char buf[2][3];
buf[0][0]·buf[0][1]·buf[0][2]·buf[1][0]·buf[1][1]·buf[1][2]
因爲C語言中只會以機械式的值拷貝的方式傳遞參數(實參把值傳給形參),因此在數組作函數參數的時候,是無法知道數組大小的,須要額外傳遞數組大小數據
int fun(char a[20], size_t b) { printf("%d\t%d",b,sizeof(a)); }
二維數組能夠看作是一維數組
二維數組中的每一個元素是一維數組
二維數組參數中第一維的參數能夠省略
void f(int a[5]); ==> void f(int a[]); ==> void f(int* a);
void g(int a[3][3]) ==> void g(int a[][3]); ==> void g(int (*a)[3]);