1. 程式人生 > >C/C++二維陣列(陣列指標)——二維陣列的傳值和二維陣列的一維訪問

C/C++二維陣列(陣列指標)——二維陣列的傳值和二維陣列的一維訪問

二維陣列既可以通過二維訪問也可以通過一維訪問。

對於二維陣列的傳值,引進了陣列指標。

#include <stdio.h>

void foo(int *p,int n)//一維訪問
{
    for(int i=0;i<n;i++)
        printf("%d ",p[i]);
    printf("\n");
}
//因為二維陣列的列數必須初始化
void func(int (*p)[4],int n)//引入陣列指標來傳遞二維陣列
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<4;j++)
        {
            printf("%d\t",p[i][j]);//*(*(p+i)+j)
        }
        putchar(10);
    }
    putchar(10);
}


int main()
{

    int arr[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};

    //一維訪問
    int *p=(int*)arr;//既可以通過二重迴圈訪問,也可以通過一重迴圈訪問
    foo(p,12);//通過一維傳遞
    for(int i=0;i<12;i++)
        printf("%d ",p[i]);
    printf("\n");


    //二維訪問
    func(arr,3);
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<4;j++)
        printf("%d\t",arr[i][j]);//*(*(arr+i)+j)
        putchar(10);
    }
    return 0;
}

二維可以轉一維訪問,那麼一維同樣可以轉二維訪問:

#include <stdio.h>

int main()
{
//    int arr[10];

//    int *p = arr;

//    int **pp = &arr;//錯誤

    int arr[12]={1,2,3,4,5,6,7,8,9,10,11,12};
    int (*p)[4]=(int(*)[4])arr;
    for(int i=0;i<sizeof(arr)/sizeof(int[4]);i++)
    {
        for(int j=0;j<4;j++)
        {
            printf("%d\t",p[i][j]);
        }
        putchar(10);
    }
    return 0;
}