在C++編程中,我們經常將數組作為參數傳遞到另一個函數,數組的維數不同,傳遞方式也不同,此處將作一個總結,包括一維靜態、動態數組,二維靜態、動態數組。
一,一維數組(靜態、動態一維數組)
1, 一維數組尋址形式:num[i]的地址:num+i,因此一維數組作為參數傳遞時候,只需要用數組名作為參數即可。
shuchu(num) void shuchu(int num[])
2,一維數組實例:

#include <iostream> using namespace std; void ces1(int *num) { for (int i = 0; i < 5; i++){ cout << num[i] << endl; } } void ces2(int *num, int m) { for (int i = 0; i < m; i++){ cout << num[i] << endl; } } int main() { int num1[5]; for (int i = 0; i < 5; i++){ num1[i] = i; } ces1(num1); int k = 5; int *num2 = new int[k]; for (int i = 0; i < k; i++){ num2[i] = i + 1; } ces2(num2, k); delete[] num2; return 0; }
二,二維數組
1,靜態二維數組利用數組名和第二維大小作為參數
(1)二維數組如下int num[M][N],二維數組尋址形式:num[i][j]的地址:num+i*N+j。由此可知二維數組作為參數傳遞時候,除了數組名作為參數,還需要數組第二維的大小,第一維隨意。
二維數組實參:
shuchu(num);
二維數組形參二種形式皆可:
void shuchu(num[3][4]); void shuchu(num[][4]);
(2)二維數組實例:

#include <iostream> using namespace std; void ces(int num[5][5]) //這樣可以 //void ces(int num[][5]) //這樣可以 //void ces(int num[5][]) //這樣不可以 { for (int i = 0; i < 5; i++){ for (int j = 0; j < 5; j++){ cout<<num[i][j]<<" "; } cout<<endl; } } int main() { int num[5][5]; for (int i = 0; i < 5; i++){ for (int j = 0; j < 5; j++){ num[i][j] = i * j; } } ces(num); return 0; }
2,動態二維數組利用二維指針傳遞數組參數
(1),我們知道動態二維數組的第一維和第二維都是變量,因此我們利用"數組名和二維大小作為形參"這種方式失效,此處必須利用二維指針。
二維數組實參:
shuchu(num);
二維指針作為形參:
void shuchu(int **num)
二維數組在子函數中使用方式:
num[i][j]即可
3,靜態二維數組也可用二維指針。
二維數組實參:
shuchu((int **)num); //此處需要強制轉化
二維指針作為形參:
void shuchu(int **num)
二維數組在子函數中使用方式:
這樣是不對的: num[i][j] 必須這樣: *((int *)num+5*i+j) 或 ((int *)num+5*i)[j]
4,下面給出了二維靜態數組和動態數組的兩個實例,有兩處不同,在程序中用紅色標識了

//二維靜態數組 #include <iostream> using namespace std; void ces(int **num) { for (int i = 0; i < 5; i++){ for (int j = 0; j < 5; j++){ cout<<*((int *)num+5*i+j)<<" "; //這樣可以 // cout<<((int *)num+5*i)[j]<<" "; //這樣可以 // cout<<num[i][j]<<" "; //這樣不可以 } cout<<endl; } } int main() { int num[5][5]; for (int i = 0; i < 5; i++){ for (int j = 0; j < 5; j++){ num[i][j] = i * j; } } ces((int **)num); //這樣可以 // ces(num); //這樣不可以 return 0; }

//二維動態數組 #include <iostream> using namespace std; void ces(int **num, int m, int n) { for (int i = 0; i < m; i++){ for (int j = 0; j < n; j++){ // cout<<*((int *)num+5*i+j)<<" "; //這樣不行 // cout<<((int *)num+5*i)[j]<<" "; //這樣不行 cout<<num[i][j]<<" "; //這樣可以 } cout<<endl; } } int main() { int m = 5, n = 5, i, j; int **num = new int*[m]; for (i = 0; i < m; i++) { num[i] = new int[n]; } for (i = 0; i < m; i++){ for (j = 0; j < n; j++){ num[i][j] = i * j; } } ces(num, m, n); //這樣可以 // ces((int **)num, m, n); //這樣可以 for (i = 0; i < m; i++) { delete[] num[i]; } delete[] num; return 0; }