C++數組
一維數組
聲明
typename arrayName[arraySize];
初始化
int a[5]={0};//全部初始化爲0
int a[5]={1,2};//將前2個初始化爲1,2,其餘全爲0
int a[5]={0,1,2,3,4};//分別初始化爲0,1,2,3,4
int a[]={0,1,2};//意味着數組a的長度是3
int numSize;
int a[numSize];
for(int i=0;i<numSize;i++){
a[i]=i;
}
構建動態數組
//聲明
typename* pointerName = new typename[arraySize];
//釋放
delete [] pointerName;
//例子
int numSize=10;
int* num=new int[numSize];
for(int i=0;i<numSize;i++){
num[i]=i;
}
delete [] num;
注意細節
數組名錶示的是數組的基地址,作用相當於指針
a[0]代表數組第一個元素
(a+1)[0]代表數組第二個元素
下標從0開始編號,編譯器不會檢查下標是否有效,必須使用有效的下標,否則會發生數組下標溢出
sizeof(arrayName) 得到的是數組的字節數
作爲函數參數
通過指定不帶索引的數組名來傳遞一個指向數組的指針。
傳數組給一個函數,數組類型自動轉換爲指針類型,因而傳的實際是地址。
//1.形式參數是指針
int myFunction(int* num,int numSize){
int sum=0;
for(int i=0;i<numSize;i++){
sum+=num[i];
//sum+=*(num+i);//兩者等價
}
}
//2.形式參數是已定義大小的數組
int myFunction(int num[10]){
}
//3.形式參數是未定義大小的數組
int myFunction(int num[],int numSize){
int sum=0;
for(int i=0;i<numSize;i++){
sum+=num[i];
}
作爲返回值
動態分配內存、靜態數組在函數返回之後都不會銷燬,只有當程序結束時被系統回收,或者程序員自己回收
//程序內部爲數組動態分配內存
int* myFunction(int num[],int numSize){
int resultSize=numSize;
int* result=new int[resultSize];
for(int i=0;i<numSize;i++){
result[i]=num[i];
}
return result;
}
//內部聲明靜態數組
int* myFunction(int num[],const int numSize){
const int resultSize=10;//數組的長度必須被聲明爲常量類型
static int result[resultSize];
for(int i=0;i<numSize;i++){
result[i]=num[i];
}
return result;
}
二維數組
聲明靜態數組
二維數組是數組的數組
計算機存儲方式是按行優先存儲,所以地址計算方式如下:
地址計算:num+i*columnSize+j
//傳統定義
typename arrayName[rowSize][columnSize];
//使用vector定義二維數組
vector<vector<int> >swp(rowSize,vector<int>(columnSize));
初始化靜態數組
int num[2][2]={0};//全都初始化爲0
//兩種初始化方式等價
int num[2][2]={1,2,3,4};
int num[2][2]={{1,2},{3,4}};
構建動態數組
int rowSize=2,columnSize=2;
//分配內存空間
int** num=new int*[rowSize];
for(int i=0;i<rowSize;i++){
num[i]=new int[columnSize];
}
//收回內存空間
for(int i=0;i<rowSize;i++){
delete [] num[i];
}
delete [] num;
//動態分配連續內存
int rowSize=2,columnSize=2;
int** num=new int*[rowSize];
num[0]=new int[rowSize*columnSize];//申請分配內存空間的總大小
for(int i=1;i<rowSize;i++){
num[i]=num[i-1]+columnSize;//確定每行之間的間隔
}
//輸出各元素地址
for(int i=0;i<rowSize;i++){
for(int j=0;j<columnSize;j++){
cout<<&num[i][j]<<" ";
}
cout<<endl;
}
尋址問題
可以直接使用num[i][j]尋址,也可以使用下面的方式尋址
對於int (*num)[columnSize],下面三種尋址方式等價
*(*(num+i)+j)
*(num+i*2+j)
num[i*columnSize+j]
對於int **num
可以轉換成一維數組尋址:*((int*)num+i*columnSize+j)
作爲函數參數
在函數的參數聲明中必須指明數組的列數,數組的行數沒有太大關係,可以指定也可以不指定。
因爲函數調用時傳遞的是一個指針,它指向由行向量夠成的一維數組。
//指定列不指定行,第二個參數傳入行數
void myFunction(int num[][2],int rowSize){
int sum=0;
for(int i=0;i<rowSize;i++){
for(int j=0;j<2;j++){
sum+=num[i][j];
}
}
}
//行列都指定
//傳入的數組定義必須是:int num[2][2]={};這種常量類型
//不能用:int L=2,C=2; int num[L][C]={};來定義
void myFunction(int num[2][2]){
int sum=0;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
sum+=num[i][j];
}
}
}
//使用一級指針,指定行數,第二個參數指定行數
//指向具有2個元素的一維數組,表示具有2個元素的一維數組作爲數組的1個元素
void myFunction(int (*num)[2],int rowSize){
int sum=0;
for(int i=0;i<rowSize;i++){
for(int j=0;j<2;j++){
//num:代表第0行地址;num+1:代表第1行地址
//*num+0:代表第0行,第0列元素的地址;
//*(num+1)+1:代表第1行,第1列元素的地址
sum+=*(*(num+i)+j);
//以下三者等價
//*(*(num+i)+j)<==>
//*(num+i*2+j)<==>
//num[i*columnSize+j]
}
}
}
//使用二級指針,不指定行和列,第2\3個參數分別代表行數\列數
void myFunction(int **num,int rowSize,int columnSzie){
int sum=0;
for(int i=0;i<rowSize;i++){
for(int j=0;j<columnSize;j++){
//sum+=*((int*)num+i*columnSize+j);
sum+=num[i][j];
}
}
}
作爲返回值
int** Matrix(int row,int column){
int** num=new int*[row];
for(int i=0;i<row;i++){
num[i]=new int[column];
}
for(int i=0;i<row;i++){
for(int j=0;j<column;j++){
cin>>num[i][j];
}
}
return num;
}
三維數組