在上一章中, 介紹了指針與一維數組的聯繫 (指針數組叫動態數組)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++指針目錄