Q:

Problems with 'int'

I'm new to programming, so I want to write a code that will let me input a 2 dimensional array (or a matrix in my case) and print it afterwards.
#include <iostream>
using namespace std;

void printArray( const int *array, int count ) 
    { 
       for ( int i = 0; i < count; i++ ) 
          cout << array[ i ] << " "; 

       cout << endl; 
    }

int main () {
int n;
cout<<"Please enter the length of your matrix : "<<endl;
cin>>n;
int * y=new int [n];
for (int w = 0; w <= n-1; w++ ) {

    y[w] = new int [n];
    cout<<"Insert the elements ";

            for (int z = 0; z <= n-1; z++)
            {
                cin >>y [w][z];
            }   
}

printArray(y, n);

}

However I get errors like "invalid conversion from 'int*' to 'int'" and "invalid types int[int] for array subscript". Can you please review my code and point my flaws?
Thanks

A:

You declared y as an int* which would only be 1-dimensional. You would need to declare y as int** for it to be 2-dimensional.
The reason your code does not compile is because int* y points to a single block of memory (that being an array of integers, in other words, a bunch of ints.). y[w] is one of those ints inside this array so y[w] = new int[n] fails to compile because you are trying to assign an int* to an int.
Changing y to an int** means that y can point to an array of int*s. Since each int* can point to an array of int, you will have a 2-dimensional array.
Example code for 10x10 matrix with int**:
int** iShouldUseStdVector = new int*[10]; // allocate 10 int* <--
for (int i = 0; i < 10; i++)
{
    iShouldUseStdVector[i] = new int[10]; // allocate 10 int <--
    for (int k = 0; k < 10; k++)
    {
        iShouldUseStdVector[i][k] = k;
    }
}

Example code for 10x10 matrix with std::vector:
std::vector<std::vector<int>> thisIsEasy;
for (int i = 0; i < 10; i++)
{
    thisIsEasy.push_back(std::vector<int>());
    for (int k = 0; k < 10; k++)
    {
        thisIsEasy[i].push_back(k);
    }
}

I would recommend using std::vector<std::vector<int>> y; instead since it handles the memory for you by conveniently growing as you want to add more elements and freeing the memory when its destructed.

