Array of pointers to multidimensional arrays

后端 未结 3 1904
长发绾君心
长发绾君心 2021-02-10 19:38

i have some bidimensional arrays like:

int shape1[3][5] =  {1,0,0,
             1,0,0,
             1,0,0,
             1,0,0,
             1,0,0};
int shape2[3]         


        
3条回答
  •  旧时难觅i
    2021-02-10 20:09

    I believe I just verified what I wrote was correct. The following works as expected:

    #include 
    
    int main(int argc, char **argv) {
    
    int shape1[5][3] =  {1,0,0,
                     1,0,0,
                     1,0,0,
                     1,0,0,
                     1,0,0};
    
    int shape2[5][3] =  {0,0,0,
                     0,0,0,
                     0,1,1,
                     1,1,0,
                     0,1,0};
    
    typedef int (*shapes_p)[3];
    shapes_p shapes[2] = { shape1, shape2 };
    
    shapes[0][1][0] = 5;
    shapes[1][1][0] = 5;
    
    printf("shape1[1][0] == %d\n", shape1[1][0]);
    printf("shape2[1][0] == %d\n", shape2[1][0]);
    
    }
    

    The thing to remember is that the type of shape1 and shape2 is actually:

    int *shape1[5];

    What you have in memory is 3 adjacent arrays of 5 ints each. But the actual type is pointer to array of 5 ints. When you write:

    shape1[1][2] = 1;

    you're telling the compiler to index to the second array of int[5] and then access the 3rd element of that array. What the compiler actually does is pointer arithmetic on the underlying type pointed to, in this case int[5]. You could do the same with the following code:

    int *p = shapes1[0];
    p+7 = 1;  // same as shape1[1][2] = 1;
    

    So if you want an array of pointers to int *[5] then you would do:

    typedef int (*shapes_p)[5];
    shapes_p shapes[2];
    

提交回复
热议问题