C++中二維數組傳參的方法詳解
首先需要明確,C++中其實沒有多維數組,所謂的多維數組,其實就是數組的數組;
另外,數組中元素的個數也是數組類型的一部分。
當一個數組的元素仍然是數組時,通常使用2個維度來定義它,一個數組表示數組本身的大小,另一個維度表示其元素大小(它的元素也是數組):
int ia[3][4]; //大小為3的數組,每個元素是含有4個整數的數組
int (*p)[4] = ia;//p指向含有4個整數的數組(指向第一個內層數組)
1 將給定第二維長度的二維數組作為形參傳遞
#include<iostream>
using namespace std;
void outputArray1(int ia[][4])
{
for (int i = 0; i != 3; ++i)
{
for (int j = 0; j != 4; ++j)
{
cout << ia[i][j] << endl;
}
}
}
int main()
{
int ia[3][4] = {
{1, 2, 8, 9 },
{2, 4, 9, 12},
{4, 7, 10, 13}
};
//輸出數組中所有元素
outputArray1(ia);
return 0;
}
2 使用給定第二維長度的指針作為形參傳遞
#include<iostream>
using namespace std;
void outputArray2(int (*pia)[4])
{
for (int i = 0; i != 3; ++i)
{
for (int j = 0; j != 4; ++j)
{
cout << pia[i][j] << endl;
}
}
}
int main()
{
int ia[3][4] = {
{1, 2, 8, 9 },
{2, 4, 9, 12},
{4, 7, 10, 13}
};
//輸出數組中所有元素
outputArray2(ia);
return 0;
}
3 將二維數組指針轉換成一維數組指針作為形參傳遞
將int (*ia)[4]
轉換為 int* ia
#include<iostream>
using namespace std;
void outputArray3(int *pia2)
{
for (int i = 0; i != 12; ++i)
{
cout << pia2[i] << endl;
//等價於cout<< *(pia2 + i) << endl;
}
/* 另一種寫法
for (int i = 0; i != 3; ++i)
{
for (int j = 0; j != 4; ++j)
{
cout << *(pia2 + i * 4 + j) << endl;
//等價於cout << pia2[ i * 4 + j] << endl;
}
}*/
}
int main()
{
int ia[3][4] = {
{1, 2, 8, 9 },
{2, 4, 9, 12},
{4, 7, 10, 13}
};
//輸出數組中所有元素
outputArray3((int*)ia);
return 0;
}
4 使用二級指針作為形參傳遞
#include<iostream>
using namespace std;
void outputArray4(int **pia3)
{
for (int i = 0; i != 3; ++i)
{
for (int j = 0; j != 4; ++j)
{
cout << *((int*)pia3 + i * 4 + j) << endl;//解引用指針
}
}
}
int main()
{
int ia[3][4] = {
{1, 2, 8, 9 },
{2, 4, 9, 12},
{4, 7, 10, 13}
};
//輸出數組中所有元素
outputArray4((int **)ia);//強制轉換為int**
return 0;
}
Tips:對於2維數組ia來說,ia[1]
指向第二行的第一個位置,*ia[1]
等於2,一級指針指向每行(子數組)的第一個元素,用二級指針才能定位到任意單個元素。在實際使用中盡量避免使用強制轉換和多級指針。