c++ dynamic array initialization with declaration

后端 未结 4 817
广开言路
广开言路 2020-12-03 09:12

I have function like this:

void findScarf1(bool ** matrix, int m, int n, int radius, int connectivity); 

and in main funct

相关标签:
4条回答
  • 2020-12-03 09:26

    My Following example may be helpful for you:

    #include<stdio.h>
    void f(int (*m)[7]){  // As Nawaz answred
     printf("%d\n", m[3][3]);
    
    }
    void _f(int m[6][7]){ // As I commented to your question
     printf("%d\n", m[3][3]);
    
    }
    void _f_(int m[][7]){// Second form of Nawaz's answe 
     printf("%d\n", m[3][3]);
    
    }
    void f_(int (*m)[6][7]){// Pointer of 2D array
     printf("%d\n", (*m)[3][3]);
    }
    
    int main(){
    
        int matrix[6][7] = {
        {0, 0, 1, 1, 1, 0, 0},
        {0, 0, 1, 3, 1, 0, 0},
        {0, 0, 1, 4, 1, 0, 0},
        {0, 0, 1, 5, 1, 0, 0},
        {0, 0, 1, 6, 1, 0, 0},
        {0, 0, 1, 7, 1, 0, 0}
        };
        f(matrix);
        _f(matrix);
        _f_(matrix);    
        f_(&matrix);
        return 1;
    }    
    

    question not tanged to c, but I compiled with gcc (I have not installed g++).

    ~$ gcc  -Wall -pedantic 2d.c
    ~$ ./a.out 
    5
    5
    5
    5
    

    I was not intended to post an answer, but because I commented wrong to Nawaz answer so during an experiment I written this code.

    Here one can find it working at codepacde

    0 讨论(0)
  • 2020-12-03 09:28

    If you look at how your array is laid out in memory, and compare it how a pointer-to-pointer "matrix" is laid out, you will understand why you can't pass the matrix as a pointer to pointer.

    You matrix is like this:

    [ matrix[0][0] | matrix[0][1] | ... | matrix[0][6] | matrix[1][0] | matrix[1][1] | ... ]
    

    A matrix in pointer-to-pointer is like this:

    [ matrix[0] | matrix[1] | ... ]
      |           |
      |           v
      |           [ matrix[1][0] | matrix[1][1] | ... ]
      v
      [ matrix[0][0] | matrix[0][1] | ... ]
    

    You can solve this by changing the function argument:

    bool (*matrix)[7]
    

    That makes the argument matrix a pointer to an array, which will work.


    And by the way, the matrix variable you have is not dynamic, it's fully declared and initialized by the compiler, there's nothing dynamic about it.

    0 讨论(0)
  • 2020-12-03 09:35

    Technically, a 2D array is an array of 1D arrays. So it cannot convert into pointer to pointer. It can convert into pointer to array, though.

    So this should work:

    void findScarf1(bool (*matrix)[7], int m, int n, int radius, int connectivity); 
    

    Here bool (*matrix)[7] declares a pointer to array of 7 bool.

    Hope that helps.

    0 讨论(0)
  • 2020-12-03 09:38

    You may define the function as:

    void findScarf1(bool * matrix, int m, int n, int radius, int connectivity);
    

    Or

    void findScarf1(bool matrix[][7], int m, int n, int radius, int connectivity);
    

    No matter how many dimensions an array has, it's just a block of linear memory.

    When you use the first manner, you may need to do a cast when call this function:

    findScarf1((bool *)marix, 6, 7, 3, 4);
    
    0 讨论(0)
提交回复
热议问题