Passing a pointer representing a 2D array to a function in C++

后端 未结 5 795
别那么骄傲
别那么骄傲 2020-11-30 06:01

http://www.neilstuff.com/guide_to_cpp/notes/Multi%20Dimension%20Arrays%20and%20Pointer%20Pointers.htm

According to this site, I should be able to use the following c

相关标签:
5条回答
  • 2020-11-30 06:40

    Your assigned is flawed. p_stuff; is pointer to pointer to double whereas stuff is two dimensional array( array of arrays)

    A single dimension array decays to the pointer to its first element. A 2 dimensional array decays to pointer to a single dimension array.

    Try this

    double stuff[3][3];
    double (*p_stuff)[3]; // pointer to array of 3 int
    p_stuff = stuff;
    
    0 讨论(0)
  • 2020-11-30 06:45

    double ** p_stuff; corresponds to an array of pointer to double. double stuff[3][3] doesn't have any pointers - it's a 2D array of double.

    0 讨论(0)
  • 2020-11-30 06:54

    Below is maybe your answer:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef unsigned int uint;
    uint m[10][20];
    uint **ppm;
    
    int main() {
        int i;
    
        ppm = (uint **)m;
        for (i =0; i<10; ++i)ppm[i] = (uint *)&m[i];
    
        m[1][1] = 10;
    
        printf("0x%x vs 0x%x: %d vs %d\n", ppm,m, m[1][1], *(*(ppm+1)+1));
    
        return 0;
    }
    

    The result's on console screen:

    0x6010a0 vs 0x6010a0: 10 vs 10
    
    0 讨论(0)
  • 2020-11-30 06:58

    Regarding the edit: to pass this double stuff[3][3] to a C function, you could

    1) pass a pointer to the whole 2D array:

    void dostuff(double (*a)[3][3])
    {
    // access them as (*a)[0][0] .. (*a)[2][2]
    }
    int main()
    {
        double stuff[3][3];
        double (*p_stuff)[3][3] = &stuff;
        dostuff(p_stuff);
    }
    

    2) pass a pointer to the first 1D array (first row) and the number of rows

    void dostuff(double a[][3], int rows)
    {
    // access them as a[0][0] .. a[2][2]
    }
    int main()
    {
        double stuff[3][3];
        double (*p_stuff)[3] = stuff;
        dostuff(p_stuff, 3);
    }
    

    3) pass a pointer to the first value in the first row and the number of both columns and rows

    void dostuff(double a[], int rows, int cols)
    {
    // access them as a[0] .. a[8];
    }
    int main()
    {
        double stuff[3][3];
        double *p_stuff = stuff[0];
        dostuff(p_stuff, 3, 3);
    }
    

    (that this last option is not strictly standards-compliant since it advances a pointer to an element of a 1D array (the first row) past the end of that array)

    If that wasn't a C function, there'd be a few more options!

    0 讨论(0)
  • 2020-11-30 07:04

    In addition to Cubbi's detailed answer, the following way is just natural to pass a 2-dim array to a function:

    void dostuff(void *a1, int rows, int cols)
    {
        double (*a)[cols] = (double (*)[cols]) a1;
        // access them as a[0][0] .. a[rows-1][cols-1];
    }
    int main()
    {
        double stuff[3][3];
        dostuff(stuff, 3, 3);
    }
    

    You don't have to cast them in advance since the newest C++ (C++14) supports run-time sized arrays.

    0 讨论(0)
提交回复
热议问题