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

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

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

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

例:url

#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; }

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

 

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

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


好, 如今咱们已经有了一个申请的空间的雏形:code

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

如今内存状态以下:htm

 

 

如今问题又来了: 如何申请行的空间?blog

这也不难, 想一下, 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++指针目录

相关文章
相关标签/搜索