Could anyone tell me why the second and the last receive compile-time errors?
void test(){
int array[10]{};
int (*i) [10] = &array; // works
int (*j) [10] = array; // does not work
int *k = array; // works
int *l = new int[10](); // works
int (*m) [10] = new int[10](); // does not work
exit(0);
}
I'm not sure why the second does not work without the ampersand since array and &array refer to the same address. For the last, I think it's because it can't tell we're dynamically allocating an array specifically, but I'd like this confirmed.
CodePudding user response:
I'm not sure why the second does not work without the ampersand since array and &array refer to the same address.
int (*j) [10] = array;
array
decays to int*
not int (*)[10]
in several contexts. So even though the value of array
and &array
is same the types are different. The type of array
before decaying is int [10]
which decays to int*
while the type of &array
is int (*)[10]
.
So the error is telling you that we cannot initialize a int(*)[10]
(type on the left hand side) with an int*
(type on the right hand side after decay).
error: cannot convert ‘int*’ to ‘int (*)[10]’ in initialization
Similarly in the last case int (*m) [10] = new int[10]()
the type on the right hand side is int*
which cannot be used to intialize the type on the left hand side(int (*)[10]
).