James Dickens James Dickens - 2 months ago 19
C++ Question

Pointers Confusion in C++

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;

}

Answer

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;