C++ 指针与二维(多维)数组

上一章中, 介绍了指针与一维数组的联系 (指针数组叫动态数组)

如果不是你想看的内容, 推荐查看 C++指针目录

一维数组搞定了, 二维数组或者多维? 能否按照一维数组的思路?------可以(本篇以二维数组为例, 多维数组思路一样)

例:

#include <iostream>
using namespace std;
int main()
{
    int num[3][3];
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            cin>>num[i][j];
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
            cout<<num[i][j]<<' ';
        cout<<endl;
    }
    return 0;
}

其内存状态如下, 看不懂看这里:

 

 现在问题是, 出现了3个指针, 如何将其融合于一个指针之中呢?

其实上想一想就知道, 就是双重指针 ( ** )


好, 现在我们已经有了一个申请的空间的雏形:

#include <iostream>
using namespace std;
int main()
{
    int **num=new int*[3];//申请3个指针空间(给用, 3个列)
    return 0;
}

现在内存状态如下:

 

 

现在问题又来了: 如何申请行的空间?

这也不难, 想一下, num[0], num[1], num[2] 都是指针, 而指针怎么再开辟空间, 不是又回到了一维数组指针了吗?

只要循环遍历一下列数, 在每个列指针后开辟一串n行的一维数组

#include <iostream>
using namespace std;
int main()
{
    int **num=new int*[3];
    for(int i=0;i<3;i++)
        num[i]=new int[3];
    return 0;
}

现在还有一个小问题, 释放内存如何释放?

删除开辟的行, 再删除列

#include <iostream>
using namespace std;
int main()
{
    int **num=new int*[3];
    for(int i=0;i<3;i++)
        num[i]=new int[3];
    for(int i=0;i<3;i++)
        delete[] num[i];
    delete[] num;
    return 0;
}

以下给出两种二维数组指针访问方式, 两种方式等效:

1. 指针访问 (根据矩阵行列表示的原理):

#include <iostream>
using namespace std;
int main()
{
    int **num=new int*[3];
    for(int i=0;i<3;i++)
        num[i]=new int[3];
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            cin>>*(*(num+i)+j);
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
            cout<<*(*(num+i)+j)<<' ';
        cout<<endl;
    }
    for(int i=0;i<3;i++)
        delete[] num[i];
    delete[] num;
    return 0;
}

2.常规访问:

#include <iostream>
using namespace std;
int main()
{
    int **num=new int*[3];
    for(int i=0;i<3;i++)
        num[i]=new int[3];
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
            cin>>num[i][j];
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
            cout<<num[i][j]<<' ';
        cout<<endl;
    }
    for(int i=0;i<3;i++)
        delete[] num[i];
    delete[] num;
    return 0;
}

二维数组在难度上有所提高, 多维数组以此类推, 需要好好理解

看完后同时也推荐大家看 智能指针 unique_ptr

推荐查看 C++指针目录

转载于:https://www.cnblogs.com/tweechalice/p/11438258.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值