說明:數組的數據類型是一種構造類型,而存儲數組的內存是一段連續的存儲區域。數組的數據類型決定了連續內存的訪問方式,它包括數組的三要素:起始地址、步長以及元素個數。ios
一.一維數組數組
1.形式:type 數組名[N],type爲該一維數組中元素的類型(即步長),N表示該數組中的元素個數,而數組名則是數組元素的起始地址,例如:int arr[10];ide
2.數組的大小:sizeof(數組名)=元素類型所含字節數*元素個數;spa
3.初始化:code
1 int arr1[10] = {1,2,3}; 2 //部分初始化(前三個元素) 3 int arr3[10] = {0}; 4 //數組清零
4.訪問:數組名是數組的惟一標識符,數組名具備兩重含義。blog
a.就做爲數組名時,表示一種構造類型,此時能夠用來打印數組的大小(包含的字節數),例如:內存
1 printf("%d",sizeof(數組名));
b.數組名用來訪問成員時,它表示的是首元素的地址,而對數組名取地址的時候,它表示的是整個數組的首地址,所以,如下代碼的輸出結果是不同的,這個很是重要!ci
1 int arr[8] = {1,2,3}; 2 printf("%p\t%p\n",arr,arr+1); 3 printf("%p\t%p\n",&arr,&arr+1);
程序輸出結果:get
二.二維數組it
1.形式:type name[M][N],二維數組其實也能夠當作是一個一維數組(任何多維數組均可以當作是一個一維數組),只是數據成員的的類型由基本類型(如:int、char等)變成了構造類型:一維數組(多維數組)。例如int arr[3][4]能夠當作是int[4] arr[3],這是一個一維數組,數組名爲arr,數組成員的類型爲int[4](一維數組),數組中的元素個數爲3,其它多維數組也可按此方式理解。
2.二維數組在邏輯和內存上的理解:二維數組在邏輯上能夠理解爲二維的,例如int arr[3][4],能夠想成其含有3行4列,共3*4個元素,固然也可按上述方式去理解,則理解爲該二維數組中含有3個一維數組,其中每一個一維數組中又含有四個int類型的元素,這兩種方式實際上是一致的。可是計算機的內存是線性的,這意味着內存對數據的存儲方式都是一維線性的,所以,二維數組的訪問方式能夠有如下兩種:
1 //方式一 2 for(int i = 0;i<3;i++) 3 { 4 for(int j = 0;j<4;j++) 5 printf("%d ",arr[i][j]); 6 } 7 //方式二 8 int *p = (int*)arr; 9 for(int i = 0;i<sizeof(arr)/sizeof(int);i++) 10 printf("%d ",*p++);
3.就像是一維數組同樣,二維數組名也表明其第一個元素的地址,只不過這裏的第一個元素的類型變成了一個一維數組,如int arr[3][4],執行arr+1實際上至關因而在二維數組的行間跳轉,由於arr表明的是第一個元素(一維數組),所以執行加一操做時,加的是該一維數組的大小。而執行&arr+1時,就像上面提到的同樣,加的是整個數組的大小,由於&arr+1表明的是整個數組的起始地址。
1 int arr[3][4]; 2 printf("%p %p\n",arr,arr+1); 3 printf("%p %p\n",&arr,&arr+1);
程序運行結果:
4.二維數組的訪問方式,如對於int arr[3][4],arr[i][j]表示二維數組第i行第j列的元素(第i個一維數組裏面的第j個元素),也能夠這樣來訪問:*(*(arr+i)+j),一樣表示第i行第j列的元素。對於第二種方式,能夠這樣理解:首先,arr是一個二維數組,arr+i表示指向二維數組的第i行,對其*一次則從arr這個二維數組的二維數組模式降到了這個二維數組的第i行(即降維,從二維降到了第i個一維數組),一樣的道理,對該一維數組加j再*,則又從一維數組模式降維到了單個元素模式,這就取出了該二維數組的第i行第j列的元素。二維數組的兩種訪問方式以下:
1 //方式1 2 for(int i = 0;i<3;i++) 3 { 4 for(int j = 0;j<4;j++) 5 printf("%d ",arr[i][j]); 6 } 7 //方式2 8 for(int i = 0;i<3;i++) 9 { 10 for(int j = 0;j<4;j++) 11 printf("%d ",*(*(arr+i)+j)); 12 }
三.多維數組
1.形式:type name[x][y][z],一樣的道理,也能夠理解爲是這樣一個一維數組:type [y][z] name[x],這裏再也不贅述。
四.拓展:申請一個堆上的動態二維數組,數組的行列採用輸入方式肯定,而且將數組初始化爲0
1.C++模式(輸入行和列以空格或回車鍵分隔)
1 #include <iostream> 2 using namespace std; 3 4 int **getDoubleArray(int row,int col) 5 { 6 int **p = new int*[row]; 7 for(int i = 0;i<row;i++) 8 p[i] = new int[col]; 9 return p; 10 //返回堆上的二維空間 11 } 12 13 int main() 14 { 15 int i = 0,j = 0; 16 int row ,col; 17 cin>>row>>col; 18 int **arr = getDoubleArray(row,col); 19 for(i = 0;i<row;i++) 20 for(j = 0;j < col;j++) 21 arr[i][j] = 0; 22 23 //這裏可完成對二維數組的初始化的操做 24 25 //釋放申請的空間 26 for(i = 0;i<row;i++) 27 delete [] arr[i]; 28 delete [] arr; 29 return 0; 30 }
2.c語言模式(輸入行和列以空格或回車鍵分隔)
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int **getarray(int rowl, int col) 5 { 6 int **p = (int**)malloc(rowl * sizeof(int*)); 7 for (int i = 0; i < rowl; i++) 8 p[i] = (int*)malloc(col*sizeof(int)); 9 return p; 10 } 11 12 int main() 13 { 14 int a, b; 15 scanf("%d %d",&a,&b); 16 int **p = getarray(a, b); 17 for (int i = 0; i < a; i++) 18 { 19 for (int j = 0; j < b; j++) 20 p[i][j] = 0; 21 } 22 for (int i = 0; i < a; i++) 23 { 24 for (int j = 0; j < b; j++) 25 printf("%d ",p[i][j]) ; 26 } 27 for(int i = 0;i<a;i++) 28 free (p[i]); 29 free (p); 30 return 0; 31 }
注意:返回堆上的二維空間還有其它方式,這裏暫時以以上兩種爲例。