C++中數組的使用

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;
	}

三維數組

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章