guys what is wrong here pointer question

B

Ben Bacarisse

puzzlecracker said:
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".
 
J

Juha Nieminen

Ben said:
puzzlecracker said:
int a[3][9];
f(a);

void f(int** x)
{
//do something with a
}

You have a type miss-match. [snip]
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.
 
P

Pascal J. Bourguignon

Ben Bacarisse said:
puzzlecracker said:
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[j]=i*j;
}
}
}

int main(void)
{
int* a[3];
for(int i=0;i<3;i++){
a=new int[9];
}
f(a);
for(int i=0;i<3;i++){
delete[](a);
}
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).
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,175
Messages
2,570,944
Members
47,491
Latest member
mohitk

Latest Threads

Top