直接上代碼:
#include
void Fun(int *a[],int m,int n)//
{
printf("%d\t",*a);//[0][0]
/*
int e[2][2][2]={8,7,6,5,4,3,2,1};
int *f,***g;
g=e;
f=e;//有警告,但不會報錯
printf("%d\n",*f);
*/
}
/*解釋:
Fun()中的int *a[2]表示定義指針數組a[2],a[0],a[1]存儲的都是指針,
a表示的是數組的首地址,所以相當於二級指針。(解釋了實參爲什麼要是二級指針)
a既然是指針,賦值時,實參的指針值複製給a,於是*a就表示a[0][0];
指針的等級只能說明指針的多級指向也是指針,傳參時會檢查指針等級是否匹配
但指針存儲的都是地址值,地址值改變以後,如指向存儲int型數據的存儲空間,那麼
前面加*就表示的便是這個int型數
不同等級的指針之間可以賦值。(解釋了*a=4,但**a是錯的)*/
void Fun1(int (*a)[],int m,int n)//int **a會有警告
{
printf("%d\t",**a); //int (*a)[2]可以完全用數組來操作
//int (*a)[] 只能用指針來操作數據
}
/*如果爲int (*a)[];數組指針,指向數組的指針,二級指針;
表示數組a[]的地址,老譚稱之爲"行指針"*/
int main()
{
int a[3][2]={4,5,6,1,2,3};
Fun((int **)a,3,2);//
Fun1(a,3,2);//(int **)
return 0;
}
總結:
1.函數傳參:形參就是對實參的簡單複製
2.數組傳參不能檢查數組的長度(定義的大小)
3.二維數組傳參(多維數組可以轉化爲二維或一維數組):
1.強制轉化爲一維指針,一維數組
2.通過行指針
3.強制轉化爲二維指針(沒有意義)。傳參之後都只能通過指針尋址訪問,數組形式不再適用。
所以如果行數和列數都不確定的二維數組傳參沒有必要變成二維數組。因爲傳參以後也要按照一維數組的方式進行尋址,所以不如直接強制轉化爲一維數組。
對於列數確定的二維數組可以傳參轉化爲二維數組。
如形參定義爲int a[][6]; 傳參之後還可以像原來的實參一樣,通過數組的形式訪問,很方便。
4.數組以非引用類型的傳遞時,此時數組會自動轉換爲同類型的指針,即初始化爲相應類型實參的副本。
調用函數時,函數實際操作的是指針的副本,而不會修改實參指針的值,但是可以通過指針改變數組元素的值。--來自網絡
//我的觀點:引用傳遞也是簡單的複製,只不過是多了一級指針,可以通過指針操作目標數據(驗證後看來是對的)
引用傳遞:(來自百度百科)
在C++中,函數參數的傳遞方式有引用傳遞。
所謂引用傳遞是指在調用函數時將實際參數的地址傳遞到函數中,那麼在函數中隊參數所進行的修改,將影響到實際參數。
5.參數傳遞:
在完成一定功能的函數,參數傳遞時,如果需要改變實參,最好通過引用傳遞實現對實參的操作和改變。返回值最好用來返回函數的執行狀態 ,以方便在調用函數中檢查被調用函數的執行情況,並進行提示。