Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

c++

arrays

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 code:

double stuff[3][3];
double **p_stuff;
p_stuff = stuff;

But I get a complaint that the conversion is not allowed by assignment.

Am I doing something wrong?

I have an extern "C" type function that I want to pass this double stuff[3][3] to. So I think i need to make it a pointer, right?

like image 810
Derek Avatar asked Mar 16 '11 17:03

Derek


2 Answers

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!

like image 150
Cubbi Avatar answered Sep 28 '22 15:09

Cubbi


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;
like image 21
Prasoon Saurav Avatar answered Sep 28 '22 17:09

Prasoon Saurav