C++中將二維數組(靜態的和動態的)作為函數的參數傳遞


在C++編程中,我們經常將數組作為參數傳遞到另一個函數,數組的維數不同,傳遞方式也不同,此處將作一個總結,包括一維靜態、動態數組,二維靜態、動態數組。

一,一維數組(靜態、動態一維數組)

1, 一維數組尋址形式:num[i]的地址:num+i,因此一維數組作為參數傳遞時候,只需要用數組名作為參數即可。

shuchu(num)
void shuchu(int num[])

2,一維數組實例:

#include <iostream>
using namespace std;

void ces1(int *num)
{
    for (int i = 0; i < 5; i++){
        cout << num[i] << endl;
    }
}


void ces2(int *num, int m)
{
    for (int i = 0; i < m; i++){
        cout << num[i] << endl;
    }
}


int main()
{
    int num1[5];
    for (int i = 0; i < 5; i++){
        num1[i] = i;
    }
    ces1(num1);


    int k = 5;
    int *num2 = new int[k];
    for (int i = 0; i < k; i++){
        num2[i] = i + 1;
    }
    ces2(num2, k);
    delete[] num2;


    return 0;
}
View Code

二,二維數組

 1,靜態二維數組利用數組名和第二維大小作為參數

(1)二維數組如下int num[M][N],二維數組尋址形式:num[i][j]的地址:num+i*N+j。由此可知二維數組作為參數傳遞時候,除了數組名作為參數,還需要數組第二維的大小,第一維隨意。

二維數組實參:

shuchu(num);

二維數組形參二種形式皆可:

void shuchu(num[3][4]);
void shuchu(num[][4]);

(2)二維數組實例:

#include <iostream>
using namespace std;

void ces(int num[5][5])      //這樣可以
//void ces(int num[][5])     //這樣可以
//void ces(int num[5][])     //這樣不可以
{
    for (int i = 0; i < 5; i++){
        for (int j = 0; j < 5; j++){
            cout<<num[i][j]<<" ";
        }
        cout<<endl;
    }
}

int main()
{
    int num[5][5];
    for (int i = 0; i < 5; i++){
        for (int j = 0; j < 5; j++){
            num[i][j] = i * j;
        }
    }
    ces(num);
    return 0;
}
View Code

2,動態二維數組利用二維指針傳遞數組參數

(1),我們知道動態二維數組的第一維和第二維都是變量,因此我們利用"數組名和二維大小作為形參"這種方式失效,此處必須利用二維指針。

二維數組實參:

shuchu(num);

二維指針作為形參:

void shuchu(int **num)

二維數組在子函數中使用方式:

num[i][j]即可

3,靜態二維數組也可用二維指針。

二維數組實參:

shuchu((int **)num);     //此處需要強制轉化

二維指針作為形參:

void shuchu(int **num)

二維數組在子函數中使用方式:

這樣是不對的:  num[i][j]
必須這樣:     *((int *)num+5*i+j) 或 
             ((int *)num+5*i)[j]

4,下面給出了二維靜態數組和動態數組的兩個實例,有兩處不同,在程序中用紅色標識了

//二維靜態數組
#include <iostream>
using namespace std;

void ces(int **num)
{
    for (int i = 0; i < 5; i++){
        for (int j = 0; j < 5; j++){
            cout<<*((int *)num+5*i+j)<<" ";           //這樣可以
//            cout<<((int *)num+5*i)[j]<<" ";         //這樣可以
//            cout<<num[i][j]<<" ";                   //這樣不可以
        }
        cout<<endl;
    }
}

int main()
{
    int num[5][5];
    for (int i = 0; i < 5; i++){
        for (int j = 0; j < 5; j++){
            num[i][j] = i * j;
        }
    }
    ces((int **)num);                 //這樣可以
//    ces(num);                       //這樣不可以
    return 0;
}
View Code
//二維動態數組
#include <iostream>
using namespace std;

void ces(int **num, int m, int n)
{
    for (int i = 0; i < m; i++){
        for (int j = 0; j < n; j++){
//            cout<<*((int *)num+5*i+j)<<" ";              //這樣不行
//            cout<<((int *)num+5*i)[j]<<" ";              //這樣不行 
            cout<<num[i][j]<<" ";                          //這樣可以
        }
        cout<<endl;
    }
}

int main()
{
    int m = 5, n = 5, i, j;
    int **num = new int*[m];
    for (i = 0; i < m; i++)
    {
        num[i] = new int[n];
    }
    for (i = 0; i < m; i++){
        for (j = 0; j < n; j++){
            num[i][j] = i * j;
        }
    }
    ces(num, m, n);                            //這樣可以

//    ces((int **)num, m, n);                  //這樣可以
    for (i = 0; i < m; i++)
    {
        delete[] num[i];
    }
    delete[] num;
    return 0;
}
View Code


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM