I have a problem when I try to pass the pointer of an array (which contains parameters needed by some functions in my program) to a structure, which then should be passed to
double d[4][3];
is an array of arrays. double b**;
is a pointer to pointer. These types are not the same (the common "arrays are just pointers" you might have read on the internet is wrong).
Elements of d
are of type double[3]
. Arrays, when passed around, decay to pointers to their first element (see section 4.2. of C++ standard). d
will decay to double(*)[3]
(a pointer to array of 3 doubles).
Long story short, double(*)[3]
is not convertible to double**
and this is what compiler is telling you.
If you need to keep d
as it is, you need to declare b as double (*b)[3]
;
For more in-depth explanation, refer to this SO question.
It's because a pointer to a pointer (or an array of pointers as it can be used as) is not the same as an array of arrays. The layout in memory is incompatible.
For example, lets say we have these two declarations:
char aa[2][2] = { { 'a', 'b' }, { 'c', 'd' } };
char **pp;
pp = new char*[2];
pp[0] = new char[2];
pp[1] = new char[2];
The array aa
looks like this in memory:
+----------+----------+----------+----------+
| aa[0][0] | aa[0][1] | aa[1][0] | aa[1][1] |
+----------+----------+----------+----------+
The "array" pp
meanwhile looks like this:
+------+------+
| a[0] | a[1] |
+------+------+
| |
| v
| +---------+---------+
| | a[0][0] | a[0][1] |
| +---------+---------+
V
+---------+---------+
| a[0][0] | a[0][1] |
+---------+---------+
The "array" pp
contains pointers to another "array"