Reputation: 4275
why does the pointer array "equivalence" not work in the following case?
void foo(int** x) {
cout << x[0][1];
}
int main( ) {
int a[2][2] = {{1,2},{2,3}};
foo(a);
}
thank you
Upvotes: 4
Views: 267
Reputation: 1271
because the type is not int **. this right for foo function
foo(int *[2]);
type of pointer a is not int ** , exactly int* [2]..
Upvotes: 0
Reputation: 31579
The memory model of int** and int[2][2] is different.
int a[2][2]
is stored in memory as:
&a : a[0][0]
&a + 4 : a[0][1]
&a + 8 : a[1][0]
&a + 12: a[1][1]
int** x
:
&x : addr1
&x + 4 : addr2
addr1 : x[0][0]
addr1 + 4: x[0][1]
addr2 : x[1][0]
addr2 + 4: x[1][1]
while addr1
and addr2
are just addresses in memory.
You just can't convert one to the other.
Upvotes: 11
Reputation: 168736
It doesn't work because only the first level of the multidimensional array decays to a pointer. Try this:
#include <iostream>
using std::cout;
void foo(int (*x)[2]) {
cout << x[0][1];
}
int main( ) {
int a[2][2] = {{1,2},{2,3}};
foo(a);
}
Upvotes: 4