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++指針目錄

相關文章
相關標籤/搜索