C語言用二維陣列作為函式入口引數的小結
C語言裡面定義了二維陣列
int arr[100][200];
那arr就是一個指標,指標型別是什麼呢?是int(*)[200]。
所以最自然的是用下面的func2(int (*a)[200]) 或func3(int a[][200]),這樣main函式呼叫的時候直接用func2(arr)或func3(arr)就可以了。這裡的a是一個一維指標,指向一個int陣列,這個陣列有200個元素。
當然也可以用func0(int *a),但func0裡面不能直接用a[i][j],因為編譯器不認識。
訪問a[i][j]要用*(a + 200 * i + j)。
也可以用func1(int **a),這是要注意先把a轉換為一維的(int *)陣列,然後再用*((int *)a + 200 * i + j)來訪問。
#include <stdio.h>
void func0(int *a) {
printf("In func0()\n");
//a[2][6] = 921; // the compiler cannot recognize it!!!
*(a + 200 * 2 + 6) = 921;
}
void func1(int **a) {
printf("In func1()\n");
//a[2][6] = 921; // the compiler cannot recognize it!!!
*((int *)a + 200 * 2 + 6) = 921;
}
void func2(int (*a)[200]) {
printf("In func2()\n");
a[0][1] = 234;
a[3][4] = 723;
printf("a = %p, a + 1 = %p\n", a, a + 1);
printf("a[3][4] = %d\n", a[3][4]);
return;
}
void func3(int a[][200]) {
printf("In func3()\n");
a[0][1] = 234;
a[3][4] = 723;
printf("a = %p, a + 1 = %p\n", a, a + 1);
printf("a[3][4] = %d\n", a[3][4]);
return;
}
int main() {
int arr[100][200];
printf("arr = %p &arr[0] = %p\n", arr, &arr[0]);
printf("arr + 1 = %p arr + 2 = %p\n", arr + 1, arr + 2);
char *p = (char *)arr;
printf("p = %p p + 1 = %p\n", p, p + 1);
printf("sizeof(arr) = %lu\n", sizeof(arr));
func0((int *)arr);
func1((int **)arr);
func2(arr);
func3(arr);
printf("arr[2][6]=%d\n", arr[2][6]);
return 0;
}
擴充套件到3維陣列怎麼辦呢?假設我們定義了int arr[100][200][300]。
實際上類似func2(), func3(),我們可以用
func2(int (*a)[200][300])
或
func2(int a[][200][300])
當然也可以用類似func0()或func1()的二維或三維指標來搞定。
相關文章
- 二維陣列作為引數傳遞問題陣列
- C語言結構體及函式傳遞陣列引數示例C語言結構體函式陣列
- 對 “C語言指標變數作為函式引數” 的個人理解C語言指標變數函式
- 【C語言】函式的概念和函式的呼叫(引數傳遞)C語言函式
- 二級指標,二維陣列函式引數傳遞指標陣列函式
- GO語言————6.7 將函式作為引數Go函式
- C語言_結構體變數指標做函式引數的使用案例C語言結構體變數指標函式
- SQLBulkOperations及陣列作引數的SQLSQL陣列
- C語言 將函式(有參、無參)作為引數傳遞C語言函式
- Go語言Slice作為函式引數詳解Go函式
- c++ -- 二維陣列引數傳遞C++陣列
- CTF逆向:將陣列作為函式程式碼執行陣列函式
- C語言函式手冊:c語言庫函式大全|C語言標準函式庫|c語言常用函式查詢C語言函式
- C語言 二維陣列課題程式碼C語言陣列
- 函式式思維和函數語言程式設計函式函數程式設計
- C語言的函式C語言函式
- JavaScript replace()第二個引數為函式時的引數JavaScript函式
- c語言獲取陣列長度的函式C語言陣列函式
- C語言獲得陣列長度的函式C語言陣列函式
- C語言函式傳遞指標引數的問題詳解C語言函式指標
- 關於C++引用做為函式引數和指標作為函式引數C++函式指標
- C語言生成隨機數函式的用法C語言隨機函式
- C語言函式指標與回撥用函式C語言函式指標
- C++動態建立二維陣列,二維陣列指標,以及動態二維陣列函式傳遞C++陣列指標函式
- Swift 1.1語言函式引數的特殊情況本地引數名外部引數名Swift函式
- c語言程式設計學習之二維陣列C語言程式設計陣列
- C語言 execve()函式C語言函式
- C語言常用函式C語言函式
- c語言中二維陣列的生成及應用C語言陣列
- 函式式思維: 為什麼函數語言程式設計越來越受關注函式函數程式設計
- C#的Replace函式,使用函式作為的引數需要注意C#函式
- GO語言————6.2 函式引數與返回值Go函式
- C語言程式設計-現代方法 第二版 第3.1小節 用printf函式格式化數C語言程式設計函式
- C語言函式sscanf()的用法C語言函式
- C語言qsort函式的使用C語言函式
- Java中的函數語言程式設計(二)函式式介面Functional InterfaceJava函數程式設計函式Function
- php陣列函式小結PHP陣列函式
- 陣列作為形參陣列