Connecting Tech Pros Worldwide Forums | Help | Site Map

guys what is wrong here pointer question

puzzlecracker
Guest
 
Posts: n/a
#1: Jun 27 '08
int a[3][9];
f(a);

void f(int** x)
{
//do something with a
}
Ben Bacarisse
Guest
 
Posts: n/a
#2: Jun 27 '08

re: guys what is wrong here pointer question


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".

--
Ben.
Juha Nieminen
Guest
 
Posts: n/a
#3: Jun 27 '08

re: guys what is wrong here pointer question


Ben Bacarisse wrote:
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.
[snip]
Quote:
The reasons are messy.
I wouldn't say it's so "messy". I think it's rather simple: The
function f() above expects an array of pointers, or more precisely, a
pointer to the first element of an array which contains pointers.

'a' is not such an array. It doesn't contain pointers. 'a' is
basically just an array which can be double-indexed. Thus there's simply
no way to cast it so that it would "contain pointers" as elements. It
just contains ints as elements.
Pascal J. Bourguignon
Guest
 
Posts: n/a
#4: Jun 27 '08

re: guys what is wrong here pointer question


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__
Closed Thread