前幾天和同學討論陣列作為函式引數,感覺各種困惑。花了一些時間在網上檢視了一些資料,並加上自己的理解。記錄一下!
一. 指向指標的指標和指向陣列的指標
很多人以為「指向陣列的指標」就是「指向指標的指標」,於是有人寫這樣的**:
int a[3][4];
int **p = a;
//錯誤
陣列實際型別是int [3][4],在作為右值時可以被轉化為int (*)[4],它們都和int **不同,自然不可用。
那麼,你要用乙個指標來指向a,就要用乙個能表示 " 陣列 」 的指標,以下**是正確的:
int (*p)[4] = a; p是指向一維陣列的指標,並且這個一維陣列有4個元素。
a[0][0] 需要乙個指向整型的指標 :int *p = &a[0][0];
a[0] 需要乙個指向陣列的指標 :int (*p)[4] = &a[0]; ( 同 int (*p)[4] = a ,
[4]不能少,因為指向陣列的指標必須知道他所指向的陣列的維度)
a 需要乙個指向陣列的陣列的指標,即指向二維陣列的指標: int (*p)[3][4] = &a;
測試:
int a[3][4];
int (*p1)[4] = a;
int (*p2)[3][4] = &a;
cout輸出:從結果可以看出p1+1偏移了一行的長度,p2+1偏移了整個陣列的長度。
二. 二維陣列作為函式引數
陣列做為形參時,退化為指標
三維陣列,退化為指向二維陣列的指標
二維陣列,退化為指向一維陣列的指標
一維陣列,退化為指向型別(如int)的指標
1,這種方式形參為一級指標,即指向整型的指標,這個簡單。
int func(int *array, int m, int n)
return 0; }
return 0;
}int main(int argc,char** argv) ,,};
func(*array,m,n);
//或者func2((int *)array,m,n);
int b[2][3];
return 0;
}輸出:
2. 這種方式是實參轉化為指向陣列的指標 (即: (int*))
int func(int array[3], int m, int n)
return 0;
}int main(int argc,char** argv) ,,};
func(array,m,n);
return 0;
}輸出:
3. 一種錯誤的方式:
int func1(int **array, int m, int n)
return 0;
}int main(int argc,char** argv) ,,};
func1((int **)array,m,n);
return 0;
}如前所述,陣列array[3][3]作為右值的時候會轉化為(int *)[3],若不加強制轉換**是不能編譯通過的。
加了以後雖然編譯不錯,但是執行的時候有非法記憶體訪問。下面詳細解析一下這一**:
*(*array +i*n +j)
當 i=0, j=0時:
*array, 實際上就是取了array這個位址所存的內容,當然就是陣列的第乙個元素" 1 ", 從而 *array +i*n +j = 1;
對位址1來解引用還報記憶體錯誤嗎?
4. 陣列的引用作為函式的引數
形參用引用,形式上和指標作為引數差不多,但是可以在函式裡面通過sizeof計算陣列的大小,
void test( int (&array)[2][3] )
int main(int argc,char** argv)
輸出:
參考:
二維陣列 作為函式引數
前言 今天在實現裝配線排程程式時候,用到了二維陣列,並將其作為函式的引數。在寫程式的時候,遇到一些問題,即二維陣列做函式的引數應該如何正確表示。我寫程式的錯誤如下程式所示 1 include 2 void print int a 3 3 67intmain 8 10print a 11return0...
linux C 二維陣列 作為函式引數
c語言中怎麼用二維陣列作為函式引數 可以用二維陣列名作為實參或者形參,在被呼叫函式中對形引數組定義時可以指定所有維數的大小,也可以省略第一維的大 明,如 void func int array 3 10 void func int array 10 二者都是合法而且等價,但是不能把第二維或者更高維的...
C C 一維二維陣列作為函式引數
1.一維陣列傳參 呼叫函式時只傳陣列名 func a void func int a 10 void func int a 2.二維陣列傳參 呼叫函式時只傳陣列名 func a 注意 二維陣列作為引數傳遞給函式,必須指明陣列的列數 void func int a 3 10 void func int...