【C/C++】用指標實現二維陣列的傳遞、使用的4種示例,及各種變形。
阿新 • • 發佈:2018-12-20
請看例程。
#include <stdio.h> #include <stdlib.h> /* *func1:用int a[]傳遞二維陣列 *func2:用int a[][10]傳遞二維陣列 *func3:用int *a[10]傳遞二維 *func4:用int (*a)[10]傳遞二維陣列,但和func3不同,而與func2相同 */ int func1(int a[])//等價宣告寫法int func1(int *a);而不是int func1(const int *a); { /*以下等價,作用都是將arr1[0][3]賦值為80*/ a[3]=80; *(a+3)=80; /*以下等價,作用都是將arr1[2][3]賦值為120*/ a[2*10+3]=120; *(a+2*10+3)=120; *(a+3+2*10)=120; *(&a[3]+2*10)=120; (&a[3])[2*10]=120; 3[a+2*10]=120; (3+2*10)[a]=120; a++;a[2+2*10]=120;//這一條說明了a是可變的,a不是const //編譯錯誤的寫法:a[2][3]=120; return 0; } int func2(int a[][9]) { /*以下等價,作用都是將arr2[2][1]賦值為1*/ a[2][3]=1; *(a[2]+3)=1; *(*a+2*9+3)=1; /*以下等價,作用都是將arr2[2][3]賦值為2*/ a[2][5]=2; 5[2[a]]=2; *(a[2]+5)=2; *(*a+2*9+5)=2; *(*a+2*10+3)=2; *a[2*10+3]=2; (*a)[2*10+3]=2; (2*10)[*a+3]=2; return 0; } int func3(int *a[10]) { /*以下等價,作用都是將arr3[2][3]賦值為129*/ a[2][3]=129; *(a[2]+3)=129; *(*(a+2)+3)=129; 3[*(a+2)]=129; 3[2[a]]=129; 3[a[2]]=37; 2[a][3]=37; /*上面幾條寫法和func4中對int (a*)[10]的前面幾條寫法長得一樣 但是下面這條寫法不能用於func3,只能用於func4 *(*a+2*10+3)=37; */ return 0; } int func4(int (*a)[10])//等價於func2的宣告 { /*以下等價,作用都是將arr4[2][3]賦值為37*/ a[2][3]=37; (a[2])[3]=37; 3[2[a]]=37; 3[a[2]]=37; 2[a][3]=37; /*但這3種寫法相當於給arr4[3][2]賦值 3[a][2]=37; 2[a[3]]=37; 2[3[a]]=37; */ *(a[2]+3)=37; *(*(a+2)+3)=37; *(*a+2*10+3)=37;//本質形式 //編譯錯誤寫法:*(a+2*10+3)=129; a是指向陣列的指標,每次a+1,地址直接跳過一個int[10]陣列的大小。 //編譯正確,執行錯誤寫法:**(a+2*10+3)=129,等價於a[2*10+3][0],已經不知道跑到哪裡去了;。 return 0; } int main() { int i; int arr1[10][10]; func1(arr1); printf("%d %d\n",arr1[0][3],arr1[2][3]); int arr2[10][10]; func2(arr2); printf("%d %d\n",arr2[2][1],arr2[2][3]); int **arr3; arr3=(int**)calloc(sizeof(int*),10); for(i=0;i<10;i++) arr3[i]=(int*)calloc(sizeof(int),10); func3(arr3); printf("%d\n",arr3[2][3]); int arr4[10][10]; func4(arr4); printf("%d\n",arr4[2][3]); return 0; }