鱼C论坛

 找回密码
 立即注册
查看: 4466|回复: 10

[已解决]如何动态申请二维数组空间(在行数不确定的前提下)

[复制链接]
发表于 2018-5-28 00:04:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>
using namespace std;

int main()
{
        int num, L, H;
        cin >> num >> L >> H;         //int(*p)[5];
        int **p;                               //cin >> num >> L >> H;
        p = new int*[num];              //p = new int [num][5];
        for (int i = 0; i < 5; i++)
        {
                p[i] = new int[5]
        }
}
左边是二级指针方法,右边是错误的方法,如果不用二级指针应该怎么做?
最佳答案
2018-5-28 20:07:09
经测试,可以使用,没有问题
    int num = 3;
    int (*p)[5] = new int[num][5];

    for (int i = 0; i < num; ++i) {
        for (int j = 0; j < 5; ++j) {
            p[i][j] = 5 * i + j;
        }
    }
    for (int i = 0; i < num; ++i) {
        for (int j = 0; j < 5; ++j) {
            cout << p[i][j] << " ";
        }
        cout << endl;
    }

    cout << "p[1][3]: " << *(*(p+1)+3) << endl;

    delete[] p;


运行结果
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
p[1][3]: 8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-28 08:56:17 | 显示全部楼层
根据具体的二维数组长度计算其转换为一维,然后再用new
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-28 13:44:40 | 显示全部楼层
vector<vector<类型>> 容器名;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-28 20:07:09 | 显示全部楼层    本楼为最佳答案   
经测试,可以使用,没有问题
    int num = 3;
    int (*p)[5] = new int[num][5];

    for (int i = 0; i < num; ++i) {
        for (int j = 0; j < 5; ++j) {
            p[i][j] = 5 * i + j;
        }
    }
    for (int i = 0; i < num; ++i) {
        for (int j = 0; j < 5; ++j) {
            cout << p[i][j] << " ";
        }
        cout << endl;
    }

    cout << "p[1][3]: " << *(*(p+1)+3) << endl;

    delete[] p;


运行结果
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
p[1][3]: 8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-28 20:13:51 | 显示全部楼层
BFSDT 发表于 2018-5-28 20:07
经测试,可以使用,没有问题

你试一下num改为外部输入。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-28 20:14:46 | 显示全部楼层

大概知道一些,不过不打算用这个。想用指针解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-28 20:18:00 | 显示全部楼层
程序员的救赎 发表于 2018-5-28 20:13
你试一下num改为外部输入。

没区别的
输入5之后
5
5
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
p[1][3]: 8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-28 21:04:56 | 显示全部楼层
BFSDT 发表于 2018-5-28 20:18
没区别的
输入5之后

你的是对的,不过我不给p初始化,例如
int *p[5], num;
cin >> num;
p = new int[num][5];
就会提示错误了,那如何在定义之后再赋值呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-28 21:14:56 | 显示全部楼层
程序员的救赎 发表于 2018-5-28 21:04
你的是对的,不过我不给p初始化,例如

就会提示错误了,那如何在定义之后再赋值呢?

我这里分开也是没问题的,你应该是打错了吧
int *p[5], num;
正确的应该是
int (*p)[5], num;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-28 23:18:13 | 显示全部楼层
BFSDT 发表于 2018-5-28 21:14
我这里分开也是没问题的,你应该是打错了吧

正确的应该是

是的!两者各自的含义不是一样的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-28 23:37:53 | 显示全部楼层
程序员的救赎 发表于 2018-5-28 23:18
是的!两者各自的含义不是一样的吗?

不一样,int(*p)[5]表示的是含有任意个数元素的数组,其中每个元素都是一个int[5]数组,也就是
{
     {1,2,3,4,5},
     {1,2,3,4,5},
      ……
      {1,2,3,4,5}
}
而int*p[5]表示的是一个有5个元素,每个元素都是int*的固定大小的数组,即
{int*, int* , int* ,int*,int*}
虽然int*可以指向一个数组,但是由于指向的不一定是int[5]的数组,所以不能匹配
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-29 22:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表