1. 程式人生 > >【C/C++】用指標實現二維陣列的傳遞、使用的4種示例,及各種變形。

【C/C++】用指標實現二維陣列的傳遞、使用的4種示例,及各種變形。

請看例程。

#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;
}