利用三種不同的方式在函數參數中,傳遞二維數組:
void func(int **a,int m,int n); 利用二級指針
void func(int *a[],int m,int n); 利用一維指針數組
void func(int a[][10],int m,int n); 利用二維數組
請問:那種方式可以在函數func中通過參數a操縱傳遞進的二維數組?如果不能,原因是什麼?
下面這倆是等價的:
void func(int **a,int m,int n);
void func(int *a[],int m,int n);
不管你是 int **a
還是 int *a[]
,編譯器把a都當作“指向指針的指針”,也就是你說的二級指針。這裡如果你直接 a[1][6]
這樣訪問是沒意義的,編譯器根本不知道你每行每列的偏移嘛。
但如果你用void func(int a[][10],int m,int n);
,這就讓編譯器明確地知道:a是一個“'指向10元素int數組的指針'數組”,a[1][6]
是可以成功訪問的。
寫個代碼測下就明白了:
#include <iostream>
using namespace std;
/*
void func(int **a,int m,int n)
{
cout << a[m][n] << endl; // 編譯報錯
}
void func(int *a[],int m,int n)
{
cout << a[m][n] << endl; // 編譯報錯
}
*/
void func(int a[][10],int m,int n)
{
cout << a[m][n] << endl; // 編譯通過,輸出6
}
int main()
{
int a[2][10];
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 10; j++)
{
a[i][j] = i + j;
}
}
func(a, 1, 5);
return 0;
}