关于二维数组分配(c/c++)

来源:互联网 发布:mac秋冬色号推荐 编辑:程序博客网 时间:2024/05/21 19:21

二维数组在栈上的分配只需要定义声明就可以了,那么如果是动态分配在堆上呢?

使用二级指针(指针的指针):

    int **p = new int *[ROWS];    for(int i=0;i<ROWS;i++)             p[i] = new int[COLUMNS];

使用指针数组:

    char* p[ROWS];    for (int i = 0; i<ROWS; i++)    {        p[i] = new char[COLUMNS];    }

类似指针数组,先定义一维,再定义另一维

    typedef char rowData[COLUMNS];    rowData* p = new rowData[ROWS];    for (int i = 0; i < ROWS;i++)     {        std::snprintf(p5[i],sizeof(p5[i]),"%s","rowData Str...");    }    for (int i = 0; i < 20; i++)    {        std::printf("%s\n", p5[i]);    }

或者这样 (数组指针)

    const int column = 3;    int row = 2;    int(*xx1)[column] = new int[row][column];    for (int i = 0; i < row; i++)    {        for (int j = 0; j < column; j++)        {            xx1[i][j] = (i + 1) * 10 + j;            std::printf("%d,", xx1[i][j]);        }        std::printf("\n");    }

总的来说,除了二级指针方式之外,其余方式都要先固定其中一个维度,也就是按静态分配,在栈上…

C只支持“数组的数组”这一概念,如果你把它单纯的当作”多维数组”来理解,估计会出问题…

具体可以看下《C专家编程》,里边关于数组和指针的章节,第九、十章,做了很好的描述

数组指针和函数形参的转化可参考下图^_^

数组和指针参数是如何被编译器修改的

原创粉丝点击