Ben Bacarisse <ben.usenet@bsb.me.ukwrites:
Quote:
puzzlecracker <ironsel2000@gmail.comwrites:
>
Quote:
>int a[3][9];
>f(a);
>>
>void f(int** x)
>{
> //do something with a
>}
>
You have a type miss-match. 'a' is an array (of length 3) whose
elements are arrays of 9 ints. 'f' must be passed a pointer to a
pointer to int. There is no implicit conversion that allows 'a' to be
passed to 'f'.
>
The parameter could be declared like this:
>
void f(int x[][9]);
>
or alternatively,
>
void f(int (*x)[9]);
>
The reasons are messy. In most contexts, expressions of type "array
of T" are converted to "pointer to T" (so void f(int *x) is correct
when passing an array of ints) but this conversion applies only to the
outer array type. The 'a' in 'f(a)' is therefore converted to a value
of type "pointer to array of 9 int" and not "pointer to pointer to
int".
Alternatively, you could write:
void f(int** x)
{
// do something with x
for(int i=0;i<3;i++){
for(int j=0;j<9;j++){
x[i][j]=i*j;
}
}
}
int main(void)
{
int* a[3];
for(int i=0;i<3;i++){
a[i]=new int[9];
}
f(a);
for(int i=0;i<3;i++){
delete[](a[i]);
}
return(0);
}
That is, int** is a pointer to a pointer to an integer, which, with
the weak typing of C/C++ is the same as a pointer to a C array of
pointers to C arrays of ints. (A pointer to a C array being a pointer
to the first element of that C array).
--
__Pascal Bourguignon__