c++ -- 二維陣列引數傳遞

晚餐吃什麼發表於2018-11-25

都知道,陣列名和函式名一樣,可以當做指標(普通指標和函式指標)來用。

關於二維陣列做為形參宣告和實參傳遞,直接看程式碼:

#include <iostream>
using namespace std;

/*傳二維陣列*/

//第1種方式:傳陣列,第二維必須標明
/*void display(int arr[][4])*/
void display1(int arr[][4],const int irows)
{
    for (int i=0;i<irows;++i)
    {
        for(int j=0;j<4;++j)
        {
            cout<<arr[i][j]<<" ";     //可以採用parr[i][j]
        }
        cout<<endl;
    }
    cout<<endl;
}

//第2種方式:一重指標,傳陣列指標,第二維必須標明
/*void display(int (*parr)[4])*/
void display2(int (*parr)[4],const int irows)
{
    for (int i=0;i<irows;++i)
    {
        for(int j=0;j<4;++j)
        {
            cout<<parr[i][j]<<" ";    //可以採用parr[i][j]
        }
        cout<<endl;
    }
    cout<<endl;
}
//注意:parr[i]等價於*(parr+i),一維陣列和二維陣列都適用

//第3種方式:傳指標,不管是幾維陣列都把他看成是指標
/*void display3(int *arr)*/
void display3(int *arr,const int irows,const int icols)
{
    for(int i=0;i<irows;++i)
    {
        for(int j=0;j<icols;++j)
        {
            cout<<*(arr+i*icols+j)<<" ";   //注意:(arr+i*icols+j),不是(arr+i*irows+j)
        }
        cout<<endl;
    }
    cout<<endl;
}

/***************************************************************************/
/*
//第2種方式:一重指標,傳陣列指標void display(int (*parr)[4])
//缺陷:需要指出第二維大小
typedef int parr[4];
void display(parr *p)
{
    int *q=*p;        //q指向arr的首元素
    cout<<*q<<endl;   //輸出0
}

typedef int (*parr1)[4];
void display1(parr1 p)
{
    cout<<(*p)[1]<<endl;  //輸出1
    cout<<*p[1]<<endl;    //輸出4,[]運算子優先順序高
}
//第3種方式:
void display2(int **p)
{
    cout<<*p<<endl;           //輸出0
    cout<<*((int*)p+1+1)<<endl; //輸出2
}
*/

int main()
{
    int arr[][4]={0,1,2,3,4,5,6,7,8,9,10,11};
    int irows=3;
    int icols=4;
    display1(arr,irows);
    display2(arr,irows);

    //注意(int*)強制轉換.個人理解:相當於將a拉成了一維陣列處理。
    display3((int*)arr,irows,icols);
    return 0;
}

 推薦使用第2種方式,簡單明瞭!

https://www.cnblogs.com/cygalaxy/p/6963789.html

相關文章