At first note these are not errors but warnings - they are about things which will supposedly work, but may get you into trouble. They did not prevent compilation of the program so you can run it anyway.

If you currently have no idea on using the "const" keyword, you may safely ignore this just for now. I suppose later you'll come to this. Shortly speaking it is trying to tell compiler that you are willing to prevent some kind of modifications to array passed as parameter, but due to nested structure of array this could not be insured with given arrays. So compiler express some worriness.

At first note these are not errors but warnings - they are about things which will supposedly work, but may get you into trouble. They did not prevent compilation of the program so you can run it anyway.

If you currently have no idea on using the "const" keyword, you may safely ignore this just for now. I suppose later you'll come to this. Shortly speaking it is trying to tell compiler that you are willing to prevent some kind of modifications to array passed as parameter, but due to nested structure of array this could not be insured with given arrays. So compiler express some worriness.

Now when it comes to 2D arrays, you have to express the parameter in pointer notation rather than array notation, in order to be able to place the const keyword in the right context.
Sovoid printArray( int a[][3]);
becomesvoid printArray( int (*a)[3]);

Having done that, you can place a const keyword in the right context.void printArray( int (* const a)[3] );

However, this still doesn't prevent you from doing a[0][0] = 0; inside the function, which is what I think you wanted to achieve with all of this.