一、問題描述
使用C++編程過程中經常需要使用到二維數組,然而初級程序員在使用過程中經常會出錯使程序崩潰。下面就二維指針的定義,初始化,以及二維指針做參數給出簡單介紹。
1.二維數組的定義與初始化
在實際使用數組的時候往往開始不知道二維數組的行數和列數,因此程序需要根據用戶輸入動態定義二維數組的行和列。這里通過C++二級指針來實現,引入變量 int rowNum 行
數, int coluNum 列數, char **p 二維字符數組,這里假定二維字符數組中的字符只能為'0'和'1'。
int **ary = new char*[rowNum]; for(int i = 0; i < rowNum; ++i) ary[i] = new char[colNum];
2.二級指針內存的釋放
二級指針內存的釋放和內存的申請類似,具體代碼如下。
for(int i=0;i<rowNum;i++) { delete[] p[i];
} delete []p;
二、例程描述
下面給出一個例程,程序根據用戶輸入的 rowNum 行數, coluNum 列數,以及各個二維數組各個節點的值(假設輸入的值只有字符 '0' 和 '1') ,然后調用函數 f 將,'0' 換
成 '1' , '1'換成 '0' 后輸出。

#include "iostream" using namespace std; //將0變成1,1變成0 void f(char **p,int rowNum,int coluNum) { for(int i=0;i<rowNum;i++) { for(int j=0;j<coluNum;j++) { if(p[i][j]=='0') { p[i][j]='1'; } else { p[i][j]='0'; } } } } //從控制台獲取二維數組p的初始值 void get_p(char **p,int *rowNum,int *coluNum) { for(int i=0;i<*rowNum;i++) { for(int j=0;j<*coluNum;j++) { cin >> p[i][j]; } } } //初始化二維數組,即給指針p分配內存。這里注意要使用引用 void init_p(char**&p,int *rowNum,int *coluNum) { cin >> *rowNum >> *coluNum; p=new char*[*rowNum]; for(int i=0;i<*rowNum;i++) { p[i]=new char[*coluNum]; } } //打印二維數組 void print_p(char**p,int rowNum,int coluNum) { cout << "\n------------------------" << endl; for(int i=0;i<rowNum;i++) { for(int j=0;j<coluNum;j++) { cout << p[i][j] << " "; } cout << endl; } } //釋放內存 void destory_p(char**&p;int rowNum,int coluNum) { for(int i=0;i<*rowNum;i++) { delete p[i]; } delete p; } int main(void) { int rowNum,coluNum; //指針的行和列 char **p; //二維指針 init_p(p,&rowNum,&coluNum); //初始化指針 get_p(p,rowNum,coluNum); //給指針賦值 print_p(p,rowNum,coluNum); //打印 f(p,rowNum,coluNum); //反轉 0 和 1 print_p(p,rowNum,coluNum); //再次打印 destory_p(p,rowNum,coluNum) //釋放內存 return 0; }
注意:
1.程序在執行完相關功能應釋放申請過的內存,雖然程序結束時操作系統會自動清除,但對於需要長時間運行的程序來說如果不及時釋放內存的話程序的運行效率會越來越低,嚴重
甚至占用完絕大部分系統內存,印象其它程程序的運行。
2.在初始化二維指針時,形式參數傳值應實用C++中的引用,否則申請到的內存也只能用於局部函數,起不到初始化二維指針的效果。引用實際上是將實參的地址直接傳入到局部函
數中進行運算。
三、參考