• C++笔记-数组指针/二维数组转换指针


    参考资料:

    1. 作者 BensonLaur  :https://www.cnblogs.com/BensonLaur/p/6367077.html

    2. https://blog.csdn.net/yyc1023/article/details/24441319

    问题: 二维数组如何转换成指针

    问题:cannot convert from 'double [10][10]' to 'double ** '
    例如:double arry[5][10] = {0}; double** pp;

    pp=arry;

    直接的赋值会提示错误:cannot convert from 'double [10][10]' to 'double ** '

    解决方法:

    double arry[5][10] = {0}; 
    double (*p)[5]; for(int i=0;i<5;i++) p[i]= arry[i];

    注意:char (*p)[5] 不能写为 char *p[5]

    分析参考如下(转载):

    一个函数形如:

    void f(float **p){
        /* 想要在函数体中按二维数组的方式访问*/
        p[1][1] = 0;//c++用vc编译ok,运行出错(非法访问)
    }

    float **p; //其实这里的p并不是一个二位数组的指针,只不过是一个指向指针的指针

    错误用法例如:

    float a[2][2]={0123};
    float **p=(float**)a;//强制将二维数组指针转为指向指针的指针

    则此时

    p[0]=0;
    p[1]=1;
    p[2]=2;
    p[3]=3;

    p[0][0]=*(*(p+0)+0)=**p;
    p[0][1]=*(*(p+0)+1);

    p[0][0]  由于*p=0; ====> **p=*(0);  引用地址为零的内存,必然是错误的。

    p[0][1]=*(*p+1)====>*(4),  引用了非法内存

    同样,对于p[1][0]=*(1),p[1][1]=*(5),均引用了非法内存

    所以说,二位数组并不能简单的转换成指向指针的指针。正确的指向二维数组的指针应该是:

    float a[5][10];
    float (*p)[10];//只需要定义为指向第二维的指针,忽略第一维
    p=a;
    p[0][1]=a[0][1];

    二级指针和二维数组并不等价。二级指针是一个指向指针的指针,而二维数组其实就是一个指针,char a[3][4]; a是指向整个二维数组的首地址。它相当于(char *)[n],并不是char **;

    定义:

      数组指针: 指向数组的指针,eg:int *p1[10];

      指针数组:一个数组,其元素都是指针, eg: int (*p2)[10];

    数组指针作为返回类型:

    int (* p)[10]; /*括号是必须写的,不然就是指针数组;10是数组的大小*/

    数组指针作为返回类型:

    method 1:

    int (*getCopyArr(int (&arr)[10]))[10]
    {
        int (*n)[10] = (int (*)[10])new int[10];
        for (int i = 0; i < 10; i++)
            (*n)[i] = arr[i];
        return n;
    }
    //note:该函数返回了分配在堆的数组,如果得到该数组后没有释放内存,会导致内存泄漏,这里仅仅作为示例不考虑该问题

    method 2:

    //使用类型别名(1)
    typedef int ArrType[10];
    
    ArrType* getCopyArr()
    {
        return ....;
    }

    method 3:

    //尾置返回类型 (C++11标准)
    auto getCopyArr2()->int(*)[10]
    {
        return ....;
    }

    method 4:

    //使用类型别名(2)(C++11 标准)
    using ArrType = int[10];
    
    AttrType* getCopyArr()
    {
        return ....;
    }
  • 相关阅读:
    Redis安装测试
    linux 查看磁盘空间大小
    冷备份与热备份、双机热备与容错
    IDEA在编辑时提示could not autowire
    IntelliJ IDEA 快捷键和设置
    POI实现EXCEL单元格合并及边框样式
    metaq架构原理
    二叉树
    开启“树”之旅
    巧妙的邻接表(数组实现)
  • 原文地址:https://www.cnblogs.com/gnivor/p/9769016.html
Copyright © 2020-2023  润新知