Reputation: 962
I am confused by the slides in my c++ course. On the one hand in Example 1 int(*foo)[5] is a pointer to an integer array of 5 elements, but in Example 2 int(*numbers2)[4] points to an array of arrays (4 arrays) of type integer. How can these two have the same lefthand declaration but hold different types?
#include <iostream>
using std::cout;
using std::endl;
int main() {
//Example1
int numbers[5] = { 1,2,3,4,5 };
int(*foo)[5] = &numbers;
int *foo1 = *foo;
//Example2
int numRows = 3;
int(*numbers2)[4] = new int[numRows][4];
delete[] numbers2;
return 0;
}
Upvotes: 3
Views: 317
Reputation: 283614
The description in your question of example 2 is not exactly correct.
Try phrasing like this and you will see the parallelism.
foo
is a pointer to the first object, each object is an integer array of 5 elements. (As it turns out, the first one is the only one)numbers2
is a pointer to the first object, each object is an integer array of 4 elements. (As it turns out, there are a total of numRows
of them)A pointer data type doesn't tell you the number of objects it points to, only the type of each one.
Upvotes: 2
Reputation: 3657
Check pointer declaration reference:
Because of the array-to-pointer implicit conversion, pointer to the first element of an array can be initialized with an expression of array type:
int a[2]; int* p1 = a; // pointer to the first element a[0] (an int) of the array a int b[6][3][8]; int (*p2)[3][8] = b; // pointer to the first element b[0] of the array b, // which is an array of 3 arrays of 8 ints
So essentially speaking what lefthand numbers2
and foo
point to on the right hand side matters.
So in following numbers2
point to first element of temporary (yet unnamed) array which is an array of numRows
arrays of 4 ints
int(*numbers2)[4] = new int[numRows][4];
While foo
points to first element of numbers
which is an array of 5 ints
int(*foo)[5] = &numbers;
Upvotes: 3