二维数组作为参数传入

在编程联系中需要将一个二维数组作为参数传给函数。

bool ifincludenumber(int **a,int length,int number)
{
    int i=0;
    int j=0;
    for(;i<length;i++)
    {
        for(;j<length;j++)
        {
            printf("the value is %d\n",a[i][j]);
            if(a[i][j]>number)
            {
                return false;
            }
            if(a[i][j]==number)
            {
                return true;
            }
            if(a[i][j]<number&&a[i][j+1]>number)
            {
                break;   
            }
        }
    }
    return false;
}
void test4()
{
    int a[4][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
    int number=8;
    if(ifincludenumber((int **)a,4,number))
    {
        printf("include number %d\n",number);
    }else
    {
        printf("wo done have it\n");
    }

}

但像这样进行编译时,程序崩溃了。显示核心已转储(段错误)。这让我意识到二维数组作为参数传递给二级指针也许并不能这样简单的使用。

经过查阅一些资料,这些资料都指向:二级指针和二维数组并没有直接关系。但确实很多人因为一级指针和一维数组的常规转换,所以理所当然的在心里建立了二级指针和二维数组的等价转换。

二级指针实际上是指向指针的指针。

二维数组是连续的内存空间,其中存储相同的数据类型。在内存空间里面相当于是一维的。

正常情况下,将二维数组作为参数进行传递应该采用一下的方式:

bool ifhaveNumber_in_Array2(int (*a)[4], int length, int number)
{
    for (int i = 0; i < length; ++i)
    {
        for (int j = 0; j < 4; ++j)
        {
            cout << a[i][j] << " "; //可以采用a[i][j]
        }
        cout << endl;
    }
    return false;
}
bool ifhaveNumber_in_Array3(int a[][4], int length, int number)
{
    for (int i = 0; i < length; ++i)
    {
        for (int j = 0; j < 4; ++j)
        {
            cout << a[i][j] << " "; //可以采用a[i][j]
        }
        cout << endl;
    }
    return false;
}
void free_test()
{
    int a[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
    ifhaveNumber_in_Array3(a,4,10);//形参为二位数组,需要将第二维的大小标明
    ifhaveNumber_in_Array2(a,4,10);

}
int main(int argc,char *argv[])
{
    free_test();
    // test4();
    return 0;
}

这两种常规方式比较明显,缺陷在于在函数定义的时候就需要指定第二维的大小,这对于扩展性来说并不是一件好事。

第三种方法是不管是几维的数组,都作为指针传入,并在形参中增加二维信息,即可实现不需要写死的二维数组传递:

bool ifhaveNumber_in_Array4(int *a, int length, int number)
{
    for (int i = 0; i < length; ++i)
    {
        for (int j = 0; j < length; ++j)
        {
            cout << *(a + i * length + j) << " "; //注意:(arr+i*icols+j),不是(arr+i*irows+j)
        }
        cout << endl;
    }
    cout << endl;
    return false;
}
void free_test()
{
    
    printf("test ifhaveNumber_in_Array4\n");
    ifhaveNumber_in_Array4(*a,4,10);

}
int main(int argc,char *argv[])
{
    free_test();
    // test4();
    return 0;
}

如果非要使用二级指针来接收二维数组的话,可以采用如下办法实现:

bool ifhaveNumber_in_2Array(int **a, int row,int col, int number)
{
    //二维数组和二级指针没有关系,如果一定要用,可采用以下方式
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<col;j++)
        {
            cout<<*((int*)a+i*col+j)<< " ";//二维数组a结构实质就是一维数组
            //传入时强制转化为int**,底层变成了两层指针结构是错误的,这里要强制转化为一层结构
            //由于强制转换的int** 是错误的,所以不能把它当做二维指针来用,不能使用a[i][j]
        }
        cout << endl;
    }
    return false;
}
void free_test()
{
    int a[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
    printf("test ifhaveNumber_in_Array\n");
    ifhaveNumber_in_2Array((int **)a,4,4,10);

}
int main(int argc,char *argv[])
{
    free_test();
    // test4();
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值