zoukankan      html  css  js  c++  java
  • 二维数组打印

    今天有人问到二维数组传参的事情,自己尝试着写了下。

    int main()//must return int
    {
    int table[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
    PrintTable((int **)table,3,4);
    //RowSum( table,3);
    RowSum2( (int **)table,3,4);
    PrintTable((int **)table,3,4);
    }

    函数声明为

    void RowSum( int array[][4], int nrow);
    void RowSum2(int **array,unsigned int nrow,unsigned int mcolum);
    void PrintTable(int **array,int nrow,int mcolum);

    结果实现的时候,还出错了,刚开始一般是访问内存出错了,直接退出。

    RowSum 的实现最容易。
    //table 中保存的为首址,传参后退化为指针
    void RowSum( int A[][4], int nrow)
    {
    for ( int i=0; i<nrow; i++)
    {
    for( int j=1; j<4; j++)
    A[i][0]+=A[i][j];
    }
    }

    当传递的为二级指针时。

    void RowSum2(int **array,unsigned int nrow,unsigned int mcolum)
    {
    for ( int i=0; i<nrow; i++)
    {
    for( int j=1; j<mcolum; j++)
    *((int *)array+i*mcolum) +=*((int *)array+i*mcolum+j);//重点语句
    }
    }

    刚开始想当然的以为二级指针需要两次取解引用,结果写出语句

    *(*(array+i*mcolum)) +=*(*(array+i*mcolum)+j);

    后来才发现,只需要一次解引用,因为一次显式的做了。

    于是修改为

    *(array+i*mcolum) +=*(array+i*mcolum+j);


    编译器报错说

    error: invalid operands of types 'int*' and 'int*' to binary 'operator+'
    error: in evaluation of 'operator+=(int*, int*)'

    最后对array进行(int *)的强制类型转换。

    最终才得到正确的语句——如果不是这个+=,说不定错误又被隐藏了。

    全部简单代码

    View Code
    #include <cstdio>
    using namespace std;
    //先要声明下,否则默认函数声明为 int fun(void);
    void RowSum( int A[][4], int nrow);

    void RowSum2(int **array,unsigned int nrow,unsigned int mcolum);

    void PrintTable(int **array,int nrow,int mcolum);
    int main()//must return int
    {
    int table[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
    PrintTable((int **)table,3,4);
    //RowSum( table,3);
    RowSum2( (int **)table,3,4);

    PrintTable((int **)table,3,4);
    }
    //数组作为函数参数传递的时候,会丢失维数信息,所以需要带nrow参数。
    //table 中保存的为首址,传参后退化为指针
    void RowSum( int A[][4], int nrow)
    {
    for ( int i=0; i<nrow; i++)
    {
    for( int j=1; j<4; j++)
    A[i][0]+=A[i][j];
    }
    }
    //作为扩展可以实现为,回顾二维数组的概念
    void RowSum2(int **array,unsigned int nrow,unsigned int mcolum)
    {
    for ( int i=0; i<nrow; i++)
    {
    for( int j=1; j<mcolum; j++)
    //*((int *)array+i*mcolum) +=*((int *)array+i*mcolum+j);
    //*(*(array+i*mcolum)) +=*(*(array+i*mcolum)+j);
    *(array+i*mcolum) +=*(array+i*mcolum+j);
    }
    }
    //同理打印矩阵
    void PrintTable(int **array,int nrow,int mcolum)
    {
    for ( int i=0; i<nrow; i++)
    {
    for( int j=0; j<mcolum; j++)
    printf("%d\t",*((int *)array+i*mcolum+j));
    printf("\n");
    }
    }


    总结:

    基础要时时刻刻夯实才好,虽然一般都是用指针,但是多级指针的确很考对指针的理解。谨记之。





  • 相关阅读:
    总结
    PHP的重载-使用魔术方法实现
    用PHP实现一些常见的排序算法
    MySQL分组聚合group_concat + substr_index
    各种链接地址
    在Linux服务器上使用rz命令上传文件时时老报:Segmentation Fault,上传失败
    新安装的windows 10无法更新报0x80240fff错误的解决方案
    通过SSH key获取GitHub上项目,导入到IDEA中
    解压.zip,.tar.gz文件到指定目录,重命名文件
    byte字节数组的压缩
  • 原文地址:https://www.cnblogs.com/westfly/p/2382589.html
Copyright © 2011-2022 走看看